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

有三个并发进程A,B和C,共享一个缓冲器F,F中每次只能存放一个数。进程A每次产生一个随机数R,将其存入F中,若存放到F中的数是5的倍数,则由进程B将其取出并打印,否则由... 有三个并发进程A,B和C,共享一个缓冲器F,F中每次只能存放一个数。进程A每次产生一个随机数R,将其存入F中,若存放到F中的数是5的倍数,则由进程B将其取出并打印,否则由进程C将被5除后的余数打印出来,为防止数的丢失和重复取同一个数,现用PV操作进行管理,请写出利用记录型信号量描述此问题的算法。 展开
 我来答
手机用户37452
2010-01-25
知道答主
回答量:15
采纳率:0%
帮助的人:15.4万
展开全部
//算法描述语言使用基于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);
}

////////////////////////////////////////////////////////////
//希望能够帮到你。
蓝鲸智能科技
2024-11-21 广告
理论考试系统是我们河南蓝鲸智能科技有限公司研发的一款高效、便捷的在线考试平台。该系统集题库管理、在线组卷、自动评分等功能于一体,支持多种题型和考试模式。通过智能化的防作弊手段,确保考试的公平公正。用户可以随时随地进行在线练习和模拟考试,有效... 点击进入详情页
本回答由蓝鲸智能科技提供
梦琐天籁
2010-01-20 · TA获得超过697个赞
知道答主
回答量:149
采纳率:0%
帮助的人:85.2万
展开全部
Idn`y
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式