十三.Linux——信号量

在学习信号量之前,我们要先了解一个同样可以实现进程间通信的方式------共享内存。

共享内存:多个进程的虚拟地址空间,映射到同一块物理内存。

实现:同样需要两个进程的实现。

a.c:共享内存的创建和输入值:

b.c:调用共享内存和打印内存中的值:

执行代码后,会发现一个很大的问题:打印端会一直循环打印,而不是输入端输入一个值,打印一个值,不输入就不打印;

这个时候就需要使用到今天的主角------信号量


信号量:特殊的变量,用来做同步、互斥,解决并发竞态问题;可进行加一减一操作,都是原子操作。

减一:p操作,代表获取资源,若信号量的值为0,无法减一,那么p阻塞。

加一:v操作,代表释放资源,信号量加一,不会阻塞。

临界资源:同时时刻只运行一个进程访问的资源

临界区:访问临界资源的代码段

信号量取值分为两种:

二值信号量:只取0,1

计数信号量:0,1,3,5.....

所有到底如何使用信号量,实现我们上面所说的需求呢??

原理:控制输入端信号量s1初始为1,控制输出端信号量s2初始为0;通过加一和减一操作来控制进程是否阻塞或运行。

代码要实现的函数接口:

sem_init();//初始化信号量

sem_p();//减一操作

sem_v();//加一操作

sem_destroy();//删除信号量(全部的)

接口代码实现:

更改后的a.c:

更改后的b.c:

初始信号量s1为1,s2为0,所以输入端正常执行p(s1),减为0,输出端堵塞;

只有当输入完成,执行v(s2) ,s2加一,此时输入端堵塞,输出端正常执行p(s2),减为0;

输出完成,执行v(s1),s1为1,s2为0,循环如此,就可以实现一写一读。


这就是信号量的全部内容,感谢您的观看!!

相关推荐
xh didida1 小时前
Linux -- 进程概念
linux·服务器·开发语言·c++
凉茶钱1 小时前
【C++】string 常用函数详解
开发语言·c++·string
吴声子夜歌1 小时前
Nginx应用与运维——Nginx在Kubernetes中的应用(三)
运维·nginx·kubernetes
小小龙学IT1 小时前
ROS2 安装完全指南(Ubuntu 版):从零开始到跑通第一个节点本文
linux·运维·ubuntu
Ruiery1 小时前
Linux 6.6内核 CPU 深度解析(十二):SMT 进阶 — core scheduling 与共享算力的负载平衡
linux·运维·服务器
Wang's Blog1 小时前
Java框架 SpringCloud 快速入门: 从服务拆分到注册中心的落地路线
java·开发语言·spring cloud
影视飓风TIM1 小时前
Linux 进程虚拟地址空间详解
linux·算法
硅基手札2 小时前
【Linux内核专栏 12】VFS 与文件系统
linux
可乐鸡翅yeah_2 小时前
hls.js 缓冲区参数 maxBufferLength、maxBufferSize 通俗讲解与业务调参
开发语言·javascript·ios·音视频·safari·m3u8