操作系统考点之PV操作、信号量

如题:2020年8月

  

分析:

要明白PV操作,是对信号量进行的操作。什么是信号量呢?含义就是临界资源。当Sem大于等于零时代表可供并发进程使用的资源实体数,但sem小于零时则表示正在等待使用临街区的进程数。

当前值为1,大于0,代表的是资源数,也就是M为1,小于0才表示等待的进程数,所以N为0。答案选A.

 

再如题:2020年10月

分析:是设为6呢?还是设为8呢?设为6的话,应该满足,生产了就取走的要求,设为8也可以,生产者有9个,有8个生产,放进缓冲区后,消费者得分两次取走,不太方便。显然设为6更合适。答案选B

 

再如,综合题:2020年8月

分析:

1、得先分析有几个进程,题目明确说是2个进程,

2、分析临界资源,进而确定同步与互斥关系(判断标准,详见扩展2,需要等待就是同步,访问临界资源就是互斥),进出门,应该是只有这一个临界资源,并且要老师与学生都需要进门,一次只能进一人,但相对于老师和学生进程来说,这两个进程是互斥的,有个疑问是老师只有1人,如何先执行老师的进程呢?

      剩下就是等同学都来全了之后,老师进程再发试卷。这其实是有先后顺序的,所以是一个同步关系。

回答(1):学生与教师进程对进门的临界资源互斥访问是互斥关系,同时老师需要等全部学生来全后再发试卷,所以也是同步关系。

3、根据操作流程,确定信号量含义及初始数量,第2问题目已经给出了。进而确定位置(确定的原则是PV操作一定是成对出现的)。

回答(2):本题一共给出了三个信号量:是否进门,初始值1(放在互斥关系中);学生是否到齐,初始值为0(放在同步关系中);还有一个互斥信号量初始为1,位置已经给留好了。要求就是如何填???根据题目给出的注释:8(等待最后进门的学生来唤醒发卷子)应该是最先确定的,填P(S_StudengReday),对应的就是4填V(S_StudengReday).

             老师只有一个人,所以最好先让老师进门,所以6填P(S_Door),7填V(S_Door),这只是隐含的逻辑是老师进来后,就挂起此进程,因为要等待学生来全的信号量,所以此时不一定会是老师先来,但只要来了就会等待。

             对应到学生进程进门,所以1填P(S_Door),2填V(s_Door)

              剩下的就是对临界区操作互斥 3填P(S_Mutex),5填V(S_Mustex)

扩展:

这部分内容,可结合实际的项目来理解,对基于嵌入式操作系统的编程,是非常有用的。这就是操作系统编程的理论基础。

1、先说下PV操作的含义:

P操作:s=s-1,当s<0时,挂起进程到该信号量等待队列的未尾。

V操作:s=s+1,s<=0时,唤醒一个等待的进程,插入到就绪队列。

2、PV操作实现互斥与同步操作的特点:

基本思想就是:将每一个共享变量与一个信号量(初始值为1或0)联系起来。用PV操作将临界区包围起来。所以也称为二进制信号量。

互斥:(一般来说是两个进程间或进程内对同一资源会访问临界资源),不能同时进行,就用互斥)

⑴每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。

⑵P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。

⑶互斥信号量的初值一般为1。

同步:(两个进程间,可以同时进行,但有共享资源,两者需要竞争(需要等待,必须有个执行先后顺序就用同步,其实就是基本思想,所以说互斥就特殊的同步)

(1)、同步信号量一般不出现在同一进程中。

(2)、同步的P操作应出现在互斥的P操作前。如书上的例子。

分析:有两个共享资源分别为buffer1、buffer2.对应的操作(也就是信号量状态,即进程):1、送数据到buffer1  2、buffer1复制到buffer2  3、buffer2到打印

如何隔开访问共享资源,也就是需要几个信号量呢??

先说下:信号量为1,对应的就是互斥,因为执行一次P操作就变为0,再执行的话,就挂起这个进程。类似于C语言的{seg;}while(state);

信号量为0,对应的就是同步,因为执行到P就会挂起,只能等待另一个进程V操作。这也符合,同步的两个进程可以同时运行。相当于Cwhile(state){seg;}

为什么P操作会起来隔开共享资源的作用呢?因为P操作会产生同步或互斥的条件,所以只看P操作就会产生逻辑了。

再说下,需要几个信号量呢?因为是两个共享资源,对共享资源的存取,都需要隔开,所以需要2^2=4个信号量。想应的操作逻辑就是 存buffer1  ---->   取buffer1(同时存buffer2)  ---->取buffer2。

看进程get就是先存buffer1,先存一下,不判断条件,所以是互斥操作第一步就是P(S1) 操作 ,然后挂起此进程。

进程copy是取buffer1同进存buffer2,这里的P操作就有顺序了,得先判断条件,也就是同步,再互斥挂起进程,再操作,所以是选P(s2),再P(s4)

最后是put进程,先判断条件P(s3),同步进程,再操作。

同步还原了多进程并发操作。所以脑补出线程间独立运行的情况对于解决问题是至关重要的。RTT项目的进程不也是这么分析的吗。

3、书中的经典问题:

多生产者--消费者问题:

分析:临界资源有k个(这里抽象成了环形缓冲区),操作的话,1、生产者放   2、消费者取(这里是多个生产者,多个消费者,对应的也是多个生产者进程,多个消费者进程)既然是多个进程存,多个进程取,并且临界资源也是多个,如何处理呢?为什么临界资源抽象成环形区呢?

分层,尽管多个进程存取,但操作基本是一样的,只需要完成一个进程存,一个进程取,其他的进程都是一样的。这里对应的就是操作层。

对于数据层,也就是临界区,同样抽象成 一个 ,也就是信号量为1,存取进程间是存在互斥关系的,只有一个时,存与取不能同时进行的。实际的数据是多个,当存一个时,只要不满,还可以再存,取也是一样,只要是不为空,就可以再取。如何知道是满,还是空呢?因为涉及多个进程同时进行,所是属于同步问题。对于满还是空,可以用信号量的值来表示

这里设空时的信号量为empty,这里不再是s1,s2,而是有实际意义的名字,与现实联系,才落地!初始值为k,k个位置都是空,即开始都是空。

设满时的信号量为full,初始值为0,也是开始都为空。

对某个数取余,可以很容易就实现从0到某个数变化,所以这里并不是对数据抽象成的环形,而是操作的规律使然。存与取都是从0到某个数。

通过以上分析:得出算法:

 单双号限行问题:

分析:先找到共享资源,也就是临界资源,只有一个,车辆号码识别区,这点一定要理解透,临界资源是相对于进程来说的,分成几个进程(操作)呢?首先要先识别车辆号码,若偶进偶栅栏,若奇进奇栅栏.可见就只有一个共享资源就是识别号码区。可以归结为,往识别区放和从识别区取两个进程,然后,取的进程再分成偶和奇。根据同步的经验,要想实一个临界资源的同步,需要2^1=2个信号量,但这里有个特殊点在于取的过程分成了奇偶,所以需要多一个取的信号量,分别对应奇进程与偶进程。

 

物流存取问题:详见课本P130

脑补出来是这样子的:

从图中可以明显看到共享资源只有1个,要实现同步的话需要2个信号量,有两路的存取,同时这两路存还要实现一个互斥,所以多一个信号量,用来标识临界资源是否被占用。几个进程呢?货物1存,货物1取,货物2存,货物2取。四个操作,所以如下图:

总结,对于PV操作的设计,是相对于进程来说,先要分清几个进程(要联系实际操作,一般都可以抽象成存取两个操作),进而得到临界资源数量 ,再分析用几个信号量来实现(信号量对应的就是不同的存取的标识)如:单双号问题,存只有一个,需要一个信号量标识,取有两个,需要两个信号量标识,再如物流问题,存有两个,但两个间互斥,所以只需要两个存进间竟争一个信号量就可以,取有两个,分别对应各的信号量标识。

  • 66
    点赞
  • 514
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guangod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值