赞
踩
前言:该题题目中会给出我们一个任务(通常可以分几步完成,每一步为一个进程),要求我们用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元
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。