进程间通信--信号量

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

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

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

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

(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信号量或者计数信号量。计数信号量可以应用在生产者、消费者模型中。

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

相关推荐
米羊1218 分钟前
风险评估文档记录
开发语言·网络·php
摘星编程12 分钟前
解锁Agent智能体的未来:五大实战策略彻底革新人机协作模式
java·开发语言
Aerkui31 分钟前
Go 泛型(Generics)详解
开发语言·后端·golang
clive.li33 分钟前
go-webmvc框架推荐
开发语言·后端·golang
寻寻觅觅☆43 分钟前
东华OJ-基础题-127-我素故我在(C++)
开发语言·c++·算法
ab15151744 分钟前
2.13完成101、102、89
开发语言·c++·算法
切糕师学AI44 分钟前
NFS(网络文件系统)详解
开发语言·网络·php
芝士爱知识a1 小时前
[2026深度测评] AI期权交易平台推荐榜单:AlphaGBM领跑,量化交易的新范式
开发语言·数据结构·人工智能·python·alphagbm·ai期权工具
overmind1 小时前
oeasy Python 113 内置函数sorted中使用 reverse和key
开发语言·python
黎潇lulu1 小时前
Java运算符基础知识
java·开发语言