本文主要是介绍TYUT太原理工大学2022操作系统大题之PV操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题型一:PV操作
前言:该题题目中会给出我们一个任务(通常可以分几步完成,每一步为一个进程),要求我们用PV操作实现该任务的同步问题,类似于这样:
首先让我们用一个简单的例子(生产者-消费者问题)来理解PV操作:
一个生产者,一个消费者,公用一个缓冲区:
该任务可分为两个部分(也就是两个进程):进程1——生产者生产一个产品放入缓冲区;
进程2——消费者从缓冲区拿走产品进行消费。我们就是要用PV操作实现进程1、2的同步。
让我们来看一下完整的代码一:
begin //begin-end相当于{-}semaphore s1=1; //表示缓冲区是否为空,初值为1semaphore s2=0; //表示缓冲区中是否为满,初值为0cobegin //cobegin与coend作用是确保P生产(进程)与P消费(进程)同步进行process P生产 //用process定义进程beginLs: //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两个操作成对存在,避免发生中断endprocess P消费beginLx:从缓冲区取出一个产品;p(s2);消费该产品;v(s1);goto Lx; endcoend
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父beginLf:取一个苹果;P(S1); 放入苹果;V(S2);goto Lf;end process P母beginLm:取一个橘子;P(S1); 放入橘子;V(S3);goto Lm; endprocess P儿 beginLs:P(S3); 从盘中取橘子;V(S1); 吃橘子;goto Ls;endprocess P女beginLd:P(S2);从盘中取苹果;V(S1);吃苹果;goto Ld;endcoend
end
软件2019届真题:
谢谢“碧桃和露”5月22号打赏给我的8毛钱
谢谢“qq_52937762”5月23号打赏给我的1.6元
这篇关于TYUT太原理工大学2022操作系统大题之PV操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!