操作系统学习笔记(9) 互斥和同步的信号量算法

  1 互斥与同步解决办法之三:
  2 信号量方法(semaphores)
  3 主要是为了解决“忙等”问题。
  4 基本原理:
  5     1。多个进程传递信息合作。
  6     2。信号量定义为记录型变量s(整型,队列)
  7     信号量的定义:
  8     type semaphore = record;
  9     count:integer;
 10     queue:list of process
 11     end;
 12
 13     var s: semaphore;
 14
 15     定义对信号量的两个原子操作:
 16     waits(s) 和 signal(s)
 17
 18     wait(s){
 19         s.count -= 1
 20         if(s.count < 0){    //s.count表示正在执行的进程数,如果为负表示等待的进程数
 21             进程阻塞;
 22             进程进入s.queue队列;
 23         }
 24     }
 25
 26     signal(s){
 27         s.count += 1;
 28         if(s.count <= 0){
 29             唤醒队首进程;
 30             移出被唤醒的进程;
 31         }
 32     }
 33
 34 利用信号量实现互斥的通用模式:
 35     program nutualexclusion;
 36     const int n;//进程数
 37     semaphroe s;//定义一个信号量
 38
 39     procedure P(int i){
 40         waits(s);//等待就绪
 41         <临界区>;
 42         signal(s);//唤醒进程
 43         <其余部分>;
 44     }
 45     //主程序
 46     int main(){
 47         P(1);
 48         P(2);
 49         ...
 50         P(n);
 51         return 0;
 52     }
 53
 54
 55 信号量的物理含义:
 56     1。s.count在不同的情况下表示不同的物理含义:
 57         (1)s.count = 0 此时表示无资源可用,并且没有进程申请该资源。
 58         (2)s.count > 0 表示有资源可用,由于有资源可用,进程等待数自然为0。
 59         (3)s.count < 0 表示无资源可用,|s.count|表示等待进程数。
 60     2。wait()-signal()的物理含义:
 61         (1)wait(s)表示申请资源。可能申请到资源,也可能进入进程等待队列。
 62         (2)signal(s)表示释放资源,并且唤醒等待队列首进程。

你可能感兴趣的:(算法,list,Semaphore,Integer,Signal)