简单计算机操作系统PV操作求步骤
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单计算机操作系统PV操作求步骤相关的知识,希望对你有一定的参考价值。
若使用PV操作和信号量来控制进程P1~P5并发执行过程,则需要设置6个不同的信号量 S1~S6,且设置这6个信号的初值都为零。请根据下面的前驱后继图完成a~e五个PV操作
这个只能够参考计算机操作系统的关于 P、V 操作的章节了。即:P 操作为申请一个系统资源,信号量 sem 减 1;V 操作为释放一个系统资源,信号量 sem 加 1。来自:求助得到的回答 参考技术A a——p2进程执行完成需要唤醒p3与p5。a为v(s3),v(s4)。b——执行p3进程之前需要判断p1与p2进程是否已完成。b为P(s1),P(s3)。
c——执行p3进程后,需要唤醒p4与p5进程。c为V(s5),V(s6)
d——执行进程P4之前需要判断进程P1与P3是否已完成。p(s1),P(S2)
e——执行进程P5前需判断进程P2与进程P3是否已完成。P(S4),P(S6)
计算机操作系统关于PV操作的一道题
有三个并发进程A,B和C,共享一个缓冲器F,F中每次只能存放一个数。进程A每次产生一个随机数R,将其存入F中,若存放到F中的数是5的倍数,则由进程B将其取出并打印,否则由进程C将被5除后的余数打印出来,为防止数的丢失和重复取同一个数,现用PV操作进行管理,请写出利用记录型信号量描述此问题的算法。
//算法描述语言使用基于C语言的伪代码//算法思想:根据楼主的要求“为防止数的丢失和重复取同一个数”可以看出,进程A、进程B、进程C三者之间应该是互斥的关系。那么问题所限定的使用信号量的方式来管理的潜藏意思,就是要利用PV
原语实现并发进程在资源争夺中有效互斥。
//而具体实现的目标是“防止数的丢失”和“重复取同一个数”。由于本人不才,只讨论单任务系统下的状况。
//“数的丢失”的情况主要是进程A产生了随即变量给F后,但在进程B或者进程C处理之前又获得处理机的使用权而覆盖了之前那个未被处理过的F中的数——进程A连续获得处理机的使用权,而进程B、进
程C无法获得处理机使用权;
//“重复取同一个数”的情况则与“数的丢失”刚好相反:进程B或者进程C处理已经处理过F中的数了,但由于进程B或者进程C又再获得了处理机使用权因而F中的同一个数又被处理了一次——处理机的
使用权一直在进程B或者进程C两者手上,而进程A无法获得处理机使用权。
//因此,只要让进程A、进程B、进程C都懂得“适时弃权”的话,那么上述的要求就自然达到。
//不才本人的想法是这样的:进程A、进程B、进程C可以视为两类进程:负责生成随机数的生成进程(进程A属此类),负责处理F的处理进程(进程B、进程C属此类)。在要求下的工作流程则应该是:生
成进程→处理进程→生成进程→处理进程→……因此,我的做法便是在在进程外另外开辟一个标志位来表示上一个处理过F的进程类型——如果下一个进入临界区的进程检查标志位后,发现上次处理F的
是同类型进程,那么它就自动放弃这次处理机使用权,进入就绪队列。
//缓冲器F由于每次只能接受一段代码的使用,各进程在使用F时互斥。因此F是临界区。
//设F的信号量名为resource,初始值为0。
//再设一用于标志上一次操作F的是否为A的标示位(也是临界区)wasA:当wasA为1时,表示上次操作F的是A;当wasA为0时,表示上次操作F的不是A,而是B或者C。其信号量名为lastOper,初始值为0。
//……其他与本算法无重要关系的代码……
//进程A的算法描述
void processA(usrStruct &F)
//尝试进入临界区F
P(resource);
//尝试进入临界区wasA
P(lastOper);
//上次F的处理不是由进程A操作的吧?
if( wasA == 0 )
//上次F的处理不是由进程A操作的
//那么,生成随机数并赋值给F
//然后,修改wasA,提示下个获得临界区F的进程,它所读到的F是由进程A处理的
wasA = ~wasA;
//上次F的处理是由进程A操作的话,为了防止F中变量的丢失(没有经由进程B或进程C的操作就被新的值覆盖了),放弃处理。
//离开临界区wasA
V(lastOper);
//离开临界区wasA
V(resource);
//进程B的算法描述
void processB(usrStruct &F)
//尝试进入临界区F
P(resource);
//尝试进入临界区wasA
P(lastOper);
//上次F的处理是由进程A操作的吧?
if( wasA == 1 )
//上次F的处理是进程A操作的
//那么,F是5的倍数吧?
if( F%5 == 0 )
//打印F值
//然后,修改wasA,提醒下个获得临界区F的进程,它所读到的F不是由进程A处理的
wasA = ~wasA;
//F不是5的倍数的话,那么这个F不应该由本进程B处理,放弃处理
//上次F的处理不是由进程A操作的话,那么该值已经被别的进程处理过,为了防止重复取同一个数(进程B和进程C没有等进程A生成新的随机数给F就一再地处理同一个F),放弃处理。
//离开临界区wasA
V(lastOper);
//离开临界区wasA
V(resource);
//进程C的算法描述
void processC(usrStruct &F)
//尝试进入临界区F
P(resource);
//尝试进入临界区wasA
P(lastOper);
//上次F的处理是由进程A操作的吧?
if( wasA == 1 )
//上次F的处理是进程A操作的
//那么,F不是5的倍数吧?
if( F%5 != 0 )
//打印F%5的值
//然后,修改wasA,提醒下个获得临界区F的进程,它所读到的F不是由进程A处理的
wasA = ~wasA;
//F不是5的倍数的话,那么这个F不应该由本进程B处理,放弃处理
//上次F的处理不是由进程A操作的话,那么该值已经被别的进程处理过,为了防止重复取同一个数(进程B和进程C没有等进程A生成新的随机数给F就一再地处理同一个F),放弃处理。
//离开临界区wasA
V(lastOper);
//离开临界区wasA
V(resource);
////////////////////////////////////////////////////////////
//希望能够帮到你。 参考技术A Idn`y
以上是关于简单计算机操作系统PV操作求步骤的主要内容,如果未能解决你的问题,请参考以下文章