题型一:PV操作

前言:该题题目中会给出我们一个任务(通常可以分几步完成,每一步为一个进程),要求我们用PV操作实现该任务的同步问题,类似于这样:

首先让我们用一个简单的例子(生产者-消费者问题)来理解PV操作:

一个生产者,一个消费者,公用一个缓冲区:

该任务可分为两个部分(也就是两个进程):进程1——生产者生产一个产品放入缓冲区;

进程2——消费者从缓冲区拿走产品进行消费。我们就是要用PV操作实现进程1、2的同步。

让我们来看一下完整的代码一:
begin //begin-end相当于{-} semaphore s1=1; //表示缓冲区是否为空,初值为1 semaphore s2=0;
//表示缓冲区中是否为满,初值为0 cobegin //cobegin与coend作用是确保P生产(进程)与P消费(进程)同步进行 process P生产
//用process定义进程 begin Ls: //Ls意味L生产,下文还有Lx表示L消费 生产一个产品; //此处中文必须写,用来解释pv操作
p(s1); //s1=s1-1=0,意味着放入了产品使缓冲区不为空 产品送往缓冲区; //此处中文必须写,用来解释pv操作 v(s2);
//s2=s2+1=1,意味着取出了产品使缓冲区为空 goto Ls; //Ls和goto Ls并用相当与while(true){
},使用它是为了确保p、v两个操作成对存在,避免发生中断 end process P消费 begin Lx: 从缓冲区取出一个产品; p(s2);
消费该产品; v(s1); goto Lx; end coend end
我们还可以用代码二来代替代码一,如下:
semaphore s1=1; semaphore s2=0; main() { cobegin shengchan(); xiaofei(); coend
} shengchan() { while(true){ //while(true){ },使用它是为了确保p、v两个操作成对存在,避免发生中断
生产一个产品; //此处中文必须写,用来解释pv操作 p(s1); //s1=s1-1=0,意味着放入了产品使缓冲区不为空 产品送往缓冲区;
//此处中文必须写,用来解释pv操作 v(s2); } } xiaofei() { while(true){ 从缓冲区取出一个产品; p(s2);
消费该产品; v(s1); } }
考试时我们用代码一。

有了“生产者-消费者”的铺垫我们来看一下文章最开始的3道例题,加深理解

桌子上有一只盘子,每次只能放入一个水果。爸爸专向盘中放苹果,妈妈专向盘中放橘子,女儿专吃盘中的苹果,儿子专吃盘中的橘子。试用P、V
操作实现父、母、儿、女进程的同步。
begin semaphore S1=1;//(盘中是否为空) semaphore S2=0; //(盘中是否有苹果) semaphore S3=0;
//(盘中是否有橘子) cobegin  process P父 begin Lf: 取一个苹果; P(S1); 放入苹果;   V(S2); goto Lf;
end process P母 begin Lm: 取一个橘子; P(S1); 放入橘子; V(S3); goto Lm; end process P儿
begin Ls: P(S3); 从盘中取橘子; V(S1); 吃橘子; goto Ls; end process P女 begin Ld: P(S2);  
从盘中取苹果; V(S1); 吃苹果; goto Ld; end coend end

 

 软件2019届真题:

 谢谢“碧桃和露”5月22号打赏给我的8毛钱

谢谢“qq_52937762”5月23号打赏给我的1.6元

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信