进程间通信(6):信号量

信号量

信号量(Semaphore)也称为信号灯,典故来源于荷兰:火车根据旗标来决定是否通行。其实就是红绿灯的作用。如图。

通过红绿灯理解信号和信号量,感觉它们似乎是一样的。但是,信号量机制是根据红绿灯的事件让人等待(进程阻塞)或不等待(进程继续运行),只有这两种行为;而信号机制是根据红绿灯事件做出任何可能的处理,并不一定是等待(阻塞)或前行(不阻塞)。

在计算机领域,信号量是一个整数值,如果是正数,表示有多少个信号量,也表示可使用的信号灯数量,信号量的值也可以是0或负数。信号量要结合PV操作(两个原语)才能真正起作用,P是减一个信号灯操作,V加一个信号灯操作。

信号量有很多种变体,下面简单描述其中一种信号量的规则:

  • 1.如果一个进程请求P操作(减1操作,即请求一个信号灯),如果减去之后信号量的数值为负数,则该进程被阻塞,如果减去之后为0或正数,则放行该进程
  • 2.如果一个进程请求V操作(加1操作,即释放或增加一个信号灯),进程直接放行
  • 3.如果请求V操作,如果加1之后仍为0或负数,则放行该进程的同时还唤醒另一个被阻塞的进程。如果加1后为正数,则直接添加一个信号灯资源

总结起来很简单:如果当前没有信号灯资源(小于或等于0),那么消费信号灯(P原语)的进程就会被阻塞;如果有信号灯资源(大于0),就直接放行。如果一个进程是来生产信号灯资源的(V原语),那么这个进程当然要放行;因为添加了一个信号灯,那么还可以拥有唤醒一个被阻塞进程的能力(如果有被阻塞进程的话)。

最简单的信号量当然是初始时只使用1个信号灯,从而实现互斥锁(也称为互斥量)机制:P是申请锁操作,只有在有值为1的时候才能申请锁,否则被阻塞;V是释放锁,一直被放行。

posted @   星火撩原  阅读(291)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示