操作系统---信号量机制

1965年,荷兰学者Djikstra提出信号量(Semaphores)机制是一种卓有成效的进程同步工具

一、整型信号量

wait(S):while S<=0 do no-op;
     S:=S-1;
signal(S):  S:=S+1

no-op:不操作

二、记录型信号量

在整形信号量机制中的wait操作,只要是信号量S≤0,就会不断测试。该机制并未遵守“让权等待”的准则,而是使进程处于“忙等”的状态。

在记录型信号量是一种不存在“忙等”现象的进程同步机制。但是采取了“让权等待”的策略后又会出现多个进程等待访问同一临界资源的情况。为此,在信号量机制中出了一个需要用于表示资源数目的整形变量value外,还应增加一个进程链表指针L,用于链接上述所有等待进程。

type semapthere = record // 信号量类型 记录型
      value:integer;       // 资源数目
      L:list of process    // 进程链表指针
      end
  P、V操作如下:
  procedure wait(S)
      var S:semapthere;    // 声明一个记录型信号量 包含value和L
      begin
          S.value:=S.value-1              // 申请一个资源,资源数目少一个
         if S.value<0 then block(S.L);   // 如果资源数目小于0,说明该类资源分配完毕,调用block原语,进行自我阻塞,放弃处理机。然后将当前进程插入到信号量链表中,此时S.value的绝对值表示该信号量链表中阻塞进程的数目。
     end
 procedure signal(S)
     var S:semapthere;
     begin
         S.value:=S.value+1;             // 释放一个单位资源,资源数目加1
         if S.value<=0 then wakeup(S.L); // 如果资源数目小于0(加1后),表示仍然有进程处于阻塞状态,调用wakeup原语将S.L中第一个等待的进程唤醒。
     end

上面代码主要定义了PV操作函数中具体干了些啥!

目前只接触了这两种信号量机制,后续用到其他信号量机制会继续更新。

原创文章 209 获赞 153 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_44571270/article/details/105783384