计算机操作系统学习之信号量实现进程互斥、同步、前驱机制

一.实现进程互斥

1.分析并发进程的活动,划分临界区(如:要访问临界资源打印机,那就要将访问打印机的代码放在临界区)
2.设置互斥信号量mutex,初值为1
3.在临界区之前执行P(mutex)
4.在临界区之后执行V(mutex)

在这里插入图片描述

  • 在这个过程中其实可以理解为把临界区也当成了一个特殊的资源,并且它的数量为1
  • 对不同的临界资源需要设置不同的互斥信号量
  • P、V操作必须成对出现

二.实现进程同步

进程同步:在进程并发执行的过程中,有些操作必须有特定的“一前一后”执行顺序,但异步并发的过程中是很难做到控制进程1的某一行代码在进程0某一行代码之后执行。此时就需要进程同步,让本来异步并发的进程互相配合,有序推进。

1.确定什么地方需要实现同步,也就是要实现“一前一后”执行的两个操作
2.设置同步信号量S,初值为0
3.在前操作之后执行V(S)
4.在后操作之前执行P(S)

在这里插入图片描述

  • 举例:在这里要求代码4必须在代码2之后执行
  • 在这个过程中,信号量S其实就是一个标志,标志着代码2是否已经执行
  • 首先P1进行执行完代码2,然后执行V操作使得S的值从0变成1
  • 然后P2进程在代码2之前执行P操作使得S值变为0,S值>=0,这就代表着此时有剩余资源(也就代表着代码2已经被执行),P2进程就不会执行block原语,就会继续执行代码4
  • 如果此时没有执行代码2和V操作,直接执行P操作,那么执行完P操作之后,S的值会从0变为-1,S值<0,这就说明没有剩余资源了(也就是代表代码2还没有被执行),那么P2进程会执行block原语,主动请求阻塞,不会执行代码4。之后当执行完代码2,并且执行了V操作,使得S从-1变到0,并且此时有进程在该信号量的阻塞队列里,那么在V操作中会执行wakeup原语,唤醒P2进程,P2就会继续执行代码4
  • 这样就保证了代码4必须在代码2之后执行

三.实现进程前驱

进程P1中有一个语句S1,P2中有一个语句S2,P3中有一个语句S3…P6进程中有一个语句S6。这6个语句的执行顺序要求如下:

在这里插入图片描述

  • 也就是说S1执行之后才能执行S2和S3,S2执行之后才能执行S4和S5等等
  • 可以看到其实就是更复杂的多层进程同步问题,那么实现方法基本是和进程同步一样的
    1.为每一对前驱关系设置一个同步信号量
    2.在前操作之后为相应的同步信号量执行V操作
    3.在后操作之前为相应的同步信号量执行P操作
  • 也就是如下的操作:

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值