进程间通信--信号量

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

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

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

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

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

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

相关推荐
书源丶21 小时前
四十五、函数式接口与 Lambda 表达式
java·开发语言
java1234_小锋21 小时前
Java进程突然挂了如何排查?
java·开发语言
admiraldeworm21 小时前
c -> true 导致异常返回 404 问题排查
c语言·开发语言
qq_375916371 天前
kettle菜鸟教程
开发语言·kettle
qq_254674411 天前
Alpine Linux 基于 Debian 等系统的常规 Nginx
开发语言
故事和你911 天前
洛谷-数据结构2-1-二叉堆与树状数组1
开发语言·数据结构·c++·算法·动态规划·图论
挨踢ren1 天前
C++虚函数:从基础到高阶
java·开发语言·jvm
hhb_6181 天前
C语言核心技术难点梳理与实战案例解析
c语言·开发语言
海参崴-1 天前
C++ STL篇 红黑树的模拟实现
开发语言·c++
Dshuishui1 天前
我用 Claude Code 做了一个学术论文搜索工具
开发语言·人工智能·python·pip·uv