OS复习笔记ch5-3

引言

上一节我们学习了关于信号量机制的一些内容,包括信号量的含义,对应的PV操作等。

image.png

如图所示,上一节主要是针对信号量的互斥,其实信号量机制还可以做很多事情,比如实现进程同步和前驱关系,这一节我们先复习一下进程互斥,然后将展开进程同步和前驱关系的相关知识。

进程互斥

进程的互斥:由于各进程要求共享资源,而有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥。


进程互斥对应的口诀是“前P后V”,进入区申请资源,退出去释放资源
image.png
看图说话,进程互斥的基本解决思路如下:

  1. 实现互斥首先就是要明确互斥访问的资源是什么,即划定临界区。
    e.g., 访问打印机,一般一台电脑只连接一台打印机,此时访问打印机的相关代码就是临界区。
  2. 然后,对于临界区要设置互斥量,一般记作mutex,初值为一(只有一台打印机)
  3. 进程1在进入临界区之前需要申请mutex(mutex–),mutex非负,那么进入临界区
  4. 进程2进入临界区申请(mutex–),mutex为-1,执行阻塞原语,放入等待队列
  5. 进程1执行完临界区代码,释放临界区资源(mutex++),mutex非正,那么唤醒阻塞在mutex的进程2
    上述过程可以推而广之,适用于多个进程访问同一个互斥资源。

进程同步

进程的同步:系统中的多个进程相互合作,某些进程发生的一些事件需要满足某种时序关系,从而共同完成任务。

image.png

如图所示,getcopyput对应三个进程动作

  • f是键盘输入流,属于无界缓冲区——可以放多个数据/取多个数据
  • get是拿数据(s从f拿)
  • s、t是单缓冲区(一次只能放一个数据,一次也只能读一个数据)
  • copy执行某些特定的运算。
  • g是显示器的输出缓冲区
  • put是送数据(t送给g)
    如果进程执行不同步,即异步执行,会存在以下的可能:
    image.png
    如图所示,如果getcopyput三个进程不顺序执行,进程会由于在错误时刻存取缓冲区导致结果错误。所以,进程必须等到对应前驱进程执行结束才能读/写数据,即保证进程同步。

那么我们应该如何利用信号量机制来解决进程同步问题呢?


王道课中总结了一个解决进程同步的口诀:“前V后P”
image.png
如图所示,我们一步步分析:

  1. 首先和进程互斥一样,我们要分析我们在哪里需要满足“同步”关系,这里“一前一后”,就是说哪个进程操作在前,哪个进程操作在后。
  2. 设置一个同步信号量S,初始为0(赋值为0保证该信号量必须先释放才能申请,不能先申请再释放)
  3. 在“前操作”之后执行V(S),即前驱进程操作结束后及时释放信号量
  4. 在“后操作”之前执行P(S),即后继进程执行之前需要先申请信号量。
    这个实现的原理其实很简单,就是卡一个信号量临界点,在前驱进程释放资源之前,后继进程不能执行,会阻塞在信号量上。这样,也就满足了进程同步必须要的前后关系。

前驱关系

基于进程同步,我们可以实现更复杂的前驱关系。
先来看一个问题,小伙伴们可以结合进程同步的知识点思考一下。
image.png


其实,道理是一样的。
既然我们S2执行之前需要S1,那么就要有一个进程同步量a,在S1执行结束后释放a,S2执行前申请a,同理S3执行之前也需要S1,再增加一个同步信号量b。
以此类推,S2是S4、S5的前驱,需要两个同步量c,d,S3、S4和S5是S6的前驱,需要三个同步量e,f,g,就可以得到如下的答案。
image.png

如图所示,在“前V后P”的位置添加对应的PV操作,就可以实现进程的前驱关系。

总结

image.png
最后,我们根据王道的ppt小结一下:
信号量机制解决了两个基本问题:进程互斥和同步。
实现进程互斥的关键是

  1. 找到临界区
  2. 设置互斥信号量,赋值为1
  3. 前P后V
    实现进程同步的关键是
  4. 找到前后关系
  5. 设置同步信号量,赋值为0
  6. 前V后P

而基于进程同步,又可以衍生出更加复杂的进程前驱关系。前驱关系本质是多个进程之间的同步,采用函数复用的思想就可解决。

本节是信号量机制实际应用的底层思维,在大题和小题中经常考察,大家一定要多看多理解,尽可能形成自己的知识体系,这样我们在后续讲解实际应用的时候就会更加游刃有余。

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值