题型一: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元
版权归原作者 啦啦噜噜^_^ 所有, 如有侵权,请联系我们删除。