进程间通信--信号量

用了共享内存通信方式,带来新的问题,那就是如果多个进程同时修改同一个共享内存,很有可能就冲突了。例如两个进程都同时写一个地址,那先写的那个进程会发现内容被别人覆盖了。

为了防止多进程竞争共享资源,而造成的数据错乱,所以需要**保护机制,**使得共享的资源,在任意时刻只能被一个进程访问。正好,信号量就实现了这一保护机制。

信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据。

信号量表示资源的数量,控制信号量的方式有两种原子操作:

(1)一个是P操作,这个操作会把信号量减去1,相减后如果信号量<0,则表明资源已被占用,进程需阻塞等待;相减后如果信号量>=0,则表明还有资源可被使用,进程可正常继续执行。

(2)另一个是V操作,这个操作会把信号量加上1,相加后如果信号量<=0,则表明当前有阻塞中的进程,于是将该进程唤醒运行;相加后如果信号量>0,则表明当前没有阻塞中的进程。

P操作是用在进入共享资源之前,V操作是用在离开共享资源之后,这两个操作是必须成对出现的。

例如,如果要使得两个进程互斥访问共享内存,我们可以初始化信号量为1.

可以发现,信号初始化为1,就代表着是互斥信号量,它可以保证共享内存在任何时刻只有一个进程在访问,这就很好的保护了共享内存。

另外,在多进程里,每个进程并不一定是顺序执行的,它们基本是以各自独立的、不可预知的速度向前推进,但有时候我们又希望多个进程能密切合作,以实现一个共同的任务。

例如,进程A是负责生产数据,而进程B是负责读取数据,这两个进程是相互合作、相互依赖的,进程A必须先生产了数据,进程B才能读取到数据,所以执行是有前后顺序的。

那么这时候,就可以用信号量来实现多进程同步的方式,我们可以初始化信号量为0.

可以发现,信号量初始化为0,就代表着是同步信号量,它可以保证进程A应在进程B之前执行。

总结:

信号量可以分为同步信号量(初始化信号量为0)或者互斥信号量(初始化信号量为1),也可以分为0,1信号量或者计数信号量。计数信号量可以应用在生产者、消费者模型中。

信号量可以作为进程间通信的一种保护机制,使得共享资源可以在任意时刻只能被一个进程访问。

相关推荐
报错小能手1 小时前
Swift UI 用 MVVM 架构 Combine EventBus 实现待办清单
开发语言·ui·swift
威迪斯特1 小时前
Cobra框架:Go语言命令行开发的现代化利器
开发语言·前端·后端·golang·cobra·交互模型·命令行框架
IT利刃出鞘1 小时前
Java反射--PropertyDescriptor的使用
java·开发语言
㳺三才人子1 小时前
容器內的 H2 控制台
开发语言·前端·javascript
Evand J1 小时前
【MATLAB程序】基于RSSI的RFID二维轨迹定位仿真介绍,EKF滤波增加轨迹定位精度。附下载链接
开发语言·matlab·平面·滤波·定位·导航
遇见火星1 小时前
Firewalld 防火墙实战指南 + TCPWrapper 七层访问控制
开发语言·windows·python
guygg881 小时前
MATLAB实现Bouc-Wen模型动力响应计算
开发语言·matlab
aini_lovee1 小时前
基于MATLAB实现行人检测
开发语言·matlab
所愿ღ2 小时前
SSM框架-Spring1
java·开发语言·笔记·spring
威迪斯特2 小时前
Gorilla框架:Go语言生态中的模块化开发利器
运维·开发语言·后端·golang·web框架·维护·gorilla