PV 操作经典例题---三个进程之间的同步

问题:

  总共有 读入、执行、打印 三个进程,试用PV操作描述读入B1打印B2的同步过程。

问题解读:

  这个问题就是说了这样一件事:一个输入B1,被操作之后,成为B2,将B2打印。怎样用PV操作来说这件事。那么新的问题来了:啥是个PV操作?

  就拿这道题来解释PV操作吧,我想打印一个值,前提条件是这个值存在吧,如果不存在,那么打印这个动作就不应该被执行,不能说啥也没有在那瞎打印吧。那么怎样才能让它不执行呢?

  这就需要引入信号量机制了:

  • 当一个操作的信号量为负数的话,就会挂起等待,不执行。
  • 当一个操作的信号量为0或者正数的时候,就可以执行。
  • P操作会使信号量 -1,V操作会使信号量 +1。

解决问题:

  按理说,我有三个操作,读入(Reader)、执行(Executer)、打印(Printer),应该对应设置三个信号量R、E、P,对应PV操作流程如下图所示:

解释上图的步骤:

  首先,将输入信号量R初始化为1,保证读入进程Reader能够启动。

  如果这时候没有从Reader进程开始执行,而是试图执行Executer或者Printer进程,由于信号量E、P初始值都是0,而且一上来就是P操作,所以会使信号量E、P成为 -1,这样进程将会挂起等待,不执行。

  所以,能执行的进程只有读入进程Reader。

  接着看,执行P(R),会使信号量R-1得0,执行输入B1操作,这时候B1已经被输入了,继续执行V(E)操作来唤醒Executer进程,再往下就是执行V(R)操作来再次唤醒读入进程。这就有Bug了,因为刚刚输入的B1还不一定被Executer进程处理了呢,就唤醒了下次的读入,这就有可能出现第二次的读入内容将第一次的读入内容覆盖,导致结果错误。

  为了避免这样的Bug发生,我们需要引入第四个信号量N,即Next输入信号量,并且初始化为0。

  现在总共就有四个信号量了,分别是输入信号量R=1,Next输入信号量N=0,B1存在信号量E=0,B2存在信号量P=0,对应PV操作流程如下图所示:

解释上图的步骤:

  在三个信号量的基础之上,加入了Next输入信号量N,并初始化为0。

  当Reader进程执行到P(N)的时候,由于N的初始信号量为0,对N进行一次P操作,N-1 = -1,Reader进程将被挂起等待,无法继续执行。等到Executer进程执行完输出B2的时候,下一步执行V(N),对N进行一次V操作,N+1 = 0,Reader进程将被唤醒。这样,在将B1执行的结果B2输出之后,才允许第二次输入,可以避免因第二次输入覆盖第一次输入而导致结果错误的Bug。



  这里我再给出老师课堂上给出的答案,我个人认为两个版本的差别不是很大,所以这个就不再一步一步解释了:

结尾:

  在课堂上我给出了我的解法思路,结果一下课问同学们理解不理解我的思路?结果是问一个一个不懂,很是郁闷。遂作此文。其实我觉得我那个版本还存在问题,但是由于是自己想出来的,思维定式,一时半会找不出来,希望看懂的同学给指点指点,定当感激。


操作系统老师课堂语录收集:

1、师父领进门,修行靠个人。

2、学生的主业就是上课,所以你们没事就都来上课啊。

3、编故事也是一种能力,描述能力。

4、非我族类,其心必异。

5、要想有秩序,必须有规则。

6、千万不要等着,掌握了70%就上,做着做着就到90%了。

7、有时候方法简单一点,你就会忽略这实际上是一种方法;有时候方法复杂一点,多想几步,这个方法就上升成为一种策略了。

8、我那时候的操作系统老师对我们讲:操作系统这门课你们现在学是学不懂的,等毕业你就懂了。

9、一等人才制定游戏规则,二等人才执行游戏规则,三等人才玩游戏。

10、要想有说服力,需要用量化。

未完待续......

原文地址:https://www.cnblogs.com/littlecurl/p/PVoperation.html

时间: 2024-10-29 12:44:14

PV 操作经典例题---三个进程之间的同步的相关文章

操作系统介绍-操作系统历史,IO,进程的三态,同步异步阻塞非阻塞

1.操作系统历史 2.进程,IO,同步异步阻塞非阻塞 操作系统历史: 手工操作: 1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式.此时还没有操作系统的概念. 手工操作方式两个特点: (1)用户独占全机.不会出现因资源已被其他用户占用而等待的现象,但资源的利用率低. (2)CPU 等待手工操作.CPU的利用不充分. 批处理-磁带操作: 主机与输入机之间增加一个存储设备--磁带,在运行于主机上的监督程序的自动控制下,计算机可自动完成:成批地把输入机上的用户作业读入

python全栈开发基础【第二十一篇】互斥锁以及进程之间的三种通信方式(IPC)以及生产者个消费者模型

一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行的修改,没错,速度是慢了,牺牲了速度而保证了数据安全. 1.上厕所的小例子:你上厕所的时候肯定得锁门吧,有人来了看见门锁着,就会在外面等着,等你吧门开开出来的时候,下一个人才去上厕所. from multiprocessing import Process,Lock import os import

112 python程序中的进程操作-进程之间进行通信(mulitiProcessing Queue队列)

一.进程间通信 IPC(Inter-Process Communication) IPC机制:实现进程之间通讯 管道:pipe 基于共享的内存空间 队列:pipe+锁的概念--->queue 二.队列(Queue) 2.1 概念-----multiProcess.Queue 创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递. Queue([maxsize])创建共享的进程队列. 参数 :maxsize是队列中允许的最大项数.如果省略此参数,则无大小限制

进程-PV操作

在多道程序系统中,进程是并发执行的,这些进程间存在不同的相互制约关系. 一.临界资源 进程在运行过程中,一般会与其他的进程共享资源,而有些资源具有排他性.一次只能为一个进程所使用,通常把这种一次仅允许一个进程使用的资源称为临界资源(如:打印机.绘图机.一些进程间共享的变量.缓存区).进程访问临界资源的那段代码称为临界区,也叫临界段. 访问临界资源应遵循如下原则: 1.空闲让进(或有空即进):当进程处于临界区时,可以允许一个请求进出临界区的进程立即进出自己的临界区. 2.忙则等待(或无空则等):当

PV操作例题解析

虽然自己看了书,老师讲了课,以为对PV操作理解了,可是遇到题的时候还是不会思考.以下这道题,花了非常长时间才弄明确,如今把思路写出来,大家共同探讨下. 大家都来思考: 信号量S1.S2.S3.S4分别代表什么含义? 误区: 把S1.S2.S3.S4当成是P1.P2.P3.P4的信号量 关键点: 1.P1运行不须要信号量的制约 2.信号量初始值为0 3.结合前驱图 4.从简单入手(P4) 我的思路: 依据图中P2运行完后V(S3),P3运行完后V(S4),结合前驱图,P2在P3之前,P3在P4之前

信号量与PV操作

在操作系统中进程之间经常会存在互斥和同步两种关系.为了有效处理这种情况,W.Dijskra在1965年提出信号量和PV操作的概念(1)信号量:一种特殊的变量,表现形式是一个整型S和一个队列(2)P操作:也成为"down()和wait()操作",使S=S-1,若S<0,进程暂停执行并放入信号量的等待队列.(3)V操作,也称为"up()和signal()操作",使S=S+1,若S<=0,唤醒等待队列中的一个进程. PV操作属于进程的低级通信. 利用信号量和P

PV操作

在计算机操作系统中,PV操作是进程管理中的难点.首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:    P(S):①将信号量S的值减1,即S=S-1:           ②如果S30,则该进程继续执行:否则该进程置为等待状态,排入等待队列.    V(S):①将信号量S的值加1,即S=S+1:           ②如果S>0,则该进程继续执行:否则释放队列中第一个等待信号量的进程.PV操作的意义:我们用信号量及PV操作来

转---秒杀多线程第十二篇 多线程同步内功心法——PV操作上

阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> <秒杀多线程第七篇经典线程同步互斥量Mutex> <秒杀多线程第八篇经典线程同步信号量Semaphore> <秒杀多线程第九篇经典线程同步总结关键段事件互斥量信号量> <秒杀多线程第十篇生产者消费者问题> <秒杀多线程第十一篇读者写者问题>

秒杀多线程第十二篇 多线程同步内功心法——PV操作上

阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> <秒杀多线程第七篇经典线程同步互斥量Mutex> <秒杀多线程第八篇经典线程同步信号量Semaphore> <秒杀多线程第九篇经典线程同步总结关键段事件互斥量信号量> <秒杀多线程第十篇生产者消费者问题> <秒杀多线程第十一篇读者写者问题>