计算机操作系统关于PV操作的一道题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机操作系统关于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操作的一道题的主要内容,如果未能解决你的问题,请参考以下文章

面试题:PV操作底层与原理

操作系统原理,pv操作、求解

云计算时代操作系统Kubernetes之PV,PVC存储体系

PV操作

信号量与PV操作

一道题7