【原创】操作系统中四步法实现PV操作

发布者:系统管理员发布时间:2020-07-29浏览次数:8944

                                                      信息科学技术系  常静

操作系统中,为了避免进程的死锁,给出了一种有效的控制算法----PV操作。PV操作是一种在利用PV操作实现进程的同步与互斥时,确保进程不会产生死锁和错误的算法。同学们在学习之初往往不知如何下手,如何确定信号量,如何确定进程是同步还是互斥,首要解决的问题就是准确无误地理解PV原语的意义。
1 PV原语的含义:
P操作和V操作是不可中断的程序段,称为原语。PV原语及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的。
P原语操作的意义是:
(1)信号量减1;
(2)若信号量减1后仍大于或等于零,则进程继续执行;
(3)若信号量减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。
V原语操作的意义是:
(1)信号量加1;
(2)若相加结果大于零,则进程继续执行;
(3)若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。
PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在PV原语执行期间不允许有中断发生。其中最容易被忽略的是V操作的第三步,当相加结果小于等于零,不但要继续执行本进程,还要从该信号的等待队列中唤醒一等待进程,这点比较容易出错。
2 PV操作在进程同步中的意义
进程同步包括进程互斥和进程同步两个方面,是操作系统管理共享资源的一种手段。用P、V操作解决进程同步问题时首先应确定问题是属于进程互斥还是进程同步,或是互斥与同步的混合问题。
在互斥中,P操作的意义是判断是否能进入临界区,申请资源;V操作的意义是退出临界区,释放资源;信号量初值一般设置为资源的可用个数。
在同步中,P操作的意义是接受发来的信息、通知,表示可以执行;V操作的意义是发送消息、通知,告知对方。
并且PV操作必须成对出现,在进程的互斥问题中,它们应成对出现在同一进程中;当遇到进程同步问题时,虽然也成对出现,但P操作应在等待消息的进程中,V操作应在发送消息的进程中,只有在含有V操作的进程发送消息之后,P操作的进程才能执行。
信号量是一整数,信号量大于等于零时代表可供并发进程使用的资源实体数,但信号量小于零时则表示正在等待使用临界区的进程数。
3 实现PV的四步法
第一步确定进程的个数以及进程间关系,这一步非常重要,如果这步理解不准确,则以下都将是错误的。进程的个数主要看题目中需要PV控制的事件有多少个,则进程个数就为几。进程间的关系主要指是进程同步还是进程互斥,它决定了PV操作在进程中的意义,进程的互斥往往是进程间的顺序推进,而进程的同步是多个进程间的协同工作,具有并发性。      
第二步设置信号量的个数,一般情况下,在进程互斥中,信号量都为一个;在同步中,要根据进程间的同步关系来设置信号量的个数, 有一个也可能是多个。
第三步画出工作流程图,流程图的正确性是清楚理解题意的最好反映,也是实现PV操作的关键一步,工作流程图越准确,最后的算法就越容易实现。
第四步根据流程图转化PV操作并给信号量赋初值,如果前面的步骤都非常详细准确,则这步主要是看个人的编程基础,用不同的语言实现都可以,最好是用自己掌握较好的一门语言。
下面就一些典型例子做分析,在分析中理解“四步法”在进程同步中的实际运用:
(1)用PV原语实现进程的互斥。
    以下例子说明进程的互斥实现:哲学家进餐问题
有四位哲学家围着一个圆桌在思考和进餐,每人思考时手中什么都不拿,当需要进餐时,每人需要用刀和叉各一把,餐桌上的布置如图所示,共有两把刀和两把叉,每把刀或叉供相邻的两个人使用。请用信号量及PV操作说明四位哲学家的同步过程。
 
 
 
 
 
第一步确定进程的个数及其工作内容。本例子涉及四个进程,每个哲学家为一个进程。因相邻的两个哲学家要竞争刀或叉,刀或叉就成为了临界资源,所以属于互斥关系。
第二步确定互斥信号量的个数、含义及PV操作。设置4个互斥信号量fork1,fork2,knife1,knife2,其初值均为“1”,分别表示叉1,叉2,刀1,刀2是可用的。
第三步画工作流程图。一般情况下,互斥问题中进程的工作流程基本相同,所以只要画出其中一个进程的流程图即可。
第四步根据流程图写出相应算法。用类C语言描述互斥关系,互斥描述如下:
 
 
 
判断进程间是否互斥,关键是看进程间是否共享某一公有资源,一个公有资源与一个信号量相对应。确定信号量的值是一个关键点,它代表了可用资源实体数。
(2)用PV原语实现进程的同步。与进程互斥不同,进程同步时的信号量只与制约进程及被制约进程有关而不是与整组并发进程有关,所以称该信号量为私有信号量。利用PV原语实现进程同步的方法是:首先判断进程间的关系为同步的,且为各并发进程设置私有信号量,然后为私有信号量赋初值,最后利用PV原语和私有信号量规定各进程的执行顺序。      
另外一个问题就是P原语是不是一定在V原语的前面,回答是否定的。下面看一个例子:
例2:设在公共汽车上,司机和售票员的活动分别是:司机:启动车辆,正常行车,到站停车。售票员:上乘客,关车门,售票,开车门,下乘客。用PV操作对其控制。
分析:
第一步:确定进程间的关系。司机到站停车后,售票员方可工作。同样,售票员关车门后,司机才能工作。所以司机与售票员之间是一种同步关系。
第二步:确定信号量及其值。由于司机与售票员之间要互通消息,司机进程设置一个私有信号量S1,用于判断司机能否进行工作,初值为0。售票员进程设置一个私有信号量S2,用于判断是否停车,售票员是否能够开车门,初值为0。
第三步:画出工作流程图。此题流程图就不一致(在算法中体现)。
第四步:根据流程图写出相应算法。
实现:
 
 
 
(3)用PV原语实现进程同步与互斥的混合问题。有了上面的分析后,下面来考虑进程同步与互斥的混合问题就不难了。混合问题当中只要分清哪些是互斥信号量,哪些是共享信号量,其它的照四步法做即可,在这儿不详述。 
时间:Oct 18, 2012 4:27:00 PM   

录入者:冯春苑