计算机操作系统的pv是什么意思,计算机操作系统关于PV操作的一道题

满意答案

02ae427d08e371d7e90d5b995e828d6d.png

sbx1901

2014.06.02

02ae427d08e371d7e90d5b995e828d6d.png

采纳率:41%    等级:9

已帮助:113人

//算法描述语言使用基于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);

}

//希望能够帮到你。

00分享举报

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值