理解操作系统之信号量机制

信号量

1965年荷兰Dijkstra提出的信号量(Semaphores)是一种卓有成效的进程同步工具,在长期的应用中,得到了很大的发展,从整型信号量经过记录型信号量,进而发展为“信号量集”机制。

  • 信号量就是OS提供的管理公有资源的有效手段。
  • 信号量代表可用资源实体的数量。
1: 整形信号量

定义:把整型信号量定义为一个用于表示资源数目的整型量S,除初始化外,仅能通过两个原子操作wait(S),signal(S)来访问也就是P(S),V(S)操作

  • P操作 wait(S):
while S < 0 do no-op
    S: S +1 
  • V操作 signal(S):
S:=S+1;

注意:P、V操作是原子操作,不可中断。

2:记录型信号量

引入整型变量value(代表资源数目)、进程链表L (链接所有等待进程)
记录型数据结构:

 type  semaphore=record
               value: integer;
               L: list  of  process;
  end; 

Wait 操作:

  • 申请资源,减量操作,S.value:=S.value-1
  • 当S.value<0时,表示资源分配完,进行自我阻塞。

Signal操作:

  • 释放资源,增量操作,S.value:=S.value+1
  • 当S.value≤0,唤醒S.L链表中的等待进程
type  semaphore=record
      value: integer;
      L: list  of  process;
end; 

wait操作

wait(S)
   begin
          S.value:=S.value-1;
          if  S.value<0  then 
              block(S,L)
      end

signal操作

signal(S)
    begin
          S.value:=S.value+1;
          if  S.value<=0  then 
              wakeup(S,L)
      end

正确使用时能实现同步和互斥
含义:value>0,代表可用资源的数量
value<0,代表由于申请资源而阻塞的进程数量

记录型信号量机制:

每次只能获得或释放一个单位的资源,低效
每次分配前必须测试资源数量,看其是否大于其下界值

3: AND型信号量

两个进程A和B,共享数据D和E,为其分别设置互斥信号量Dmutex和Emutex,初值均为1。

Process  A:
    wait(Dmutex);
    wait(Emutex);
        使用D、E
    Signal(Dmutex)
    Signal(Emutex)
Process  B:
    wait(Emutex);
    wait(Dmutex);
       使用D、E
    Signal(Dmutex)
    Signal(Emutex)

Process A: wait(Dmutex); 于是Dmutex=0
Process B: wait(Emutex); 于是Emutex=0
Process A: wait(Emutex); 于是Emutex=-1 A阻塞
Process B: wait(Dmutex); 于是Dmutex=-1 B阻塞
可见:共享的资源越多,死锁的可能越大

AND同步机制的基本思想:将进程在整个运行过程中需要的所有资源,一次性全部分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其他所有可能为之分配的资源,也不分配给它。即对临界资源的分配采取原子操作。称为同时wait操作即Swait()

Swait(S1, S2, …, Sn)
    if Si >=1 and … and Sn>=1 then
          for i:=1 to n do
               Si:= Si -1 ;
          endfor
    else
4:信号量集:

对AND信号量机制加以扩充
S 为信号量;t 为下限值;d 为需求值

Swait(S1, t1, d1, …, Sn, tn, dn)
  if Si >= t1 and … and Sn>= tn then
      for i:=1 to n do
         Si:= Si - di ;
      endfor
  else
     Place the executing process in the waiting queue of the first Si with Si < ti and set its program counter to the beginning of the Swait Operation
  endif

一般信号量集的几种特殊情况:
Swait(信号量,下限值,需求值)
Swait(S, d, d),只有一个信号量S,允许每次申请d个资源,若现有资源数少于d,不予分配。
Swait(S, 1, 1),蜕化为一般的记录型信号量(S>1时)或互斥信号量(S=1时)。
Swait(S, 1, 0),当S>=1时,允许多个进程进入某特定区,当S变为0后,阻止任何进程进入特定区,相当于可控开关。

Swait(S,1,0) 这一种比较难理解,其中S表示只有S个信号量,1为下限值,如果S>=1,则允许进程进入某特定区域,需求值为0,每次S = S -0,然而当S<1时,阻止任何进程进入特定区域。

经常使用的是后两种信号量集。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容