操作系统(二十二)用信号量机制实现进程互斥、同步、前驱关系

2.3.5 用信号量机制实现进程互斥、同步、前驱关系

目录

2.3.5 用信号量机制实现进程互斥、同步、前驱关系

2.3.5.1 用信号量机制实现进程互斥

2.3.5.2 用信号量机制实现进程同步

2.3.5.3 信号量机制实现前驱关系


2.3.5.1 用信号量机制实现进程互斥

  由之前的学习我们知道进程互斥就是在同一时间访问临界资源的进程只能有一个。并且P操作是申请资源并上锁的原语,V操作时释放资源并解锁的原语,我们引用一个互斥信号量mutex表示进入临界区的名额,并设置初值为1来实现进程互斥。

   1. 分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问就应放在临界区)

   2. 设置互斥信号量 mutex,初值为 1

   3. 在进入区 P(mutex)——申请资源

   4. 在退出区 V(mutex)——释放资源
  这里需要注意:P(mutex)与V(mutex)必须成对存在,如果缺少P那么互斥性就不可以保证,如果缺少V就导致资源不能解锁,并且等待进程永远不会被唤醒。

2.3.5.2 用信号量机制实现进程同步

 进程同步就是将并发进程按照一定要求有序推进,以解决并发性带来的问题。

  1. 分析什么地方需要实现“同步关系”,即必须保证“一前一后”执行的两个操作(或两句代码)

  2. 设置同步信号量 S, 初始为0

  3. 在“前操作”之后执行 V(S)
 
  4. 在“后操作”之前执行 P(S)
  以下面的操作为例,解释一下这四个步骤的原因:
semaphore S = 0;        //初始化同步信号量,初值为0

P1(){
    操作1;
    操作2;
    V(S);
    操作3;
}

P2(){
    P(S);
    操作4;
    操作5;
    操作6;
}

  以上的代码可以保证操作2发生在操作4之前。因为异步性导致的问题我理解就是资源不足,因为第二步需要第一步所带的资源。所以同步信号量设为了0而非1(1的话意思就是资源十分充足,谁想用访问就行)。因为操作2要发生在操作4之前就是说操作2要为操作4带来所需资源,所以解锁就是释放资源,一定要在前操作之后使用。

2.3.5.3 信号量机制实现前驱关系

  前驱关系就是一个同步问题,即某一操作必须在一个操作之后。下图所示的前驱关系:S2必须在S1之后产生,S6必须在S4 S5 S3都完成之后进行。

实现步骤如下:

  1. 要为每一对前驱关系各设置一个同步信号量

  2. 在“前操作”之后对相应的同步信号量执行 V 操作

  3. 在“后操作”之前对相应的同步信号量执行 P 操作


版权声明:本文为qq_40608137原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。