PV 操作经典例题

Stella981
• 阅读 799

问题:

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

问题解读:

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

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

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

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

解决问题:

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

PV 操作经典例题

解释上图的步骤:

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

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

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

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

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

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

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。PV 操作经典例题


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

PV 操作经典例题

结尾:

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


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

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

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

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

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

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

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

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

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

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

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

未完待续......PV 操作经典例题PV 操作经典例题PV 操作经典例题

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Karen110 Karen110
3年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这