进程间通信(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 @ 2020-03-04 19:43  星火撩原  阅读(273)  评论(0编辑  收藏  举报