经典pv操作问题详解(最全面的pv资料)

经典pv操作问题详解(最全面的pv资料)

ID:12049560

大小:82.50 KB

页数:11页

时间:2018-07-15

经典pv操作问题详解(最全面的pv资料)_第1页
经典pv操作问题详解(最全面的pv资料)_第2页
经典pv操作问题详解(最全面的pv资料)_第3页
经典pv操作问题详解(最全面的pv资料)_第4页
经典pv操作问题详解(最全面的pv资料)_第5页
资源描述:

《经典pv操作问题详解(最全面的pv资料)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、经典P、V操作问题详解lionxcat@gmail.cn一、基本概念1.信号量structsemaphore{intvalue;//仅且必须附初值一次,初值非负PCBtype*wait_queue;//在此信号量上阻塞的进程队列}S;//信号量实例为S2.P、V操作P(S){S:=S-1;if(S<0)调用进程自己阻塞自己,等待在S的等待队列末尾;}V(S){S:=S+1;if(S≤0)从S等待队列头释放一进程就绪在就绪队列尾;调用进程继续执行;}3.使用方法(i).P、V操作成队出现,处理互斥时出现在同一进程中;处理同步时出现在不同进程中。(ii).同步P先于互斥P调

2、用,V的顺序无关。4.另类P、V操作导致的问题(或信号量的栈实现方法或漏斗法)[习题P174-23]某系统如此定义P、V操作:P(S):S=S-1;若S<0,本进程进入S信号量等待队列的末尾;否则,继续执行。V(S):S=S+1;若S≤0,释放等待队列中末尾的进程,否则继续运行。(1)上面定义的P、V操作是否合理?有什么问题?(2)现有四个进程P1、P2、P3、P4竞争使用某一个互斥资源(每个进程可能反复使用多次),试用上面定义的P、V操作正确解决P1、P2、P3、P4对该互斥资源的使用问题。答:(1)不合理:先进后出;可能“无限等待”,即等待队列头的进程得不到释放。(

3、2)思路:令每个信号量上的等待队列中始终只有一个进程。解决方案如下:(n个进程)n个进程至多有n-1个等待。设置n-1个信号量,每个进程阻塞在不同的信号量上,使每个等待队列至多有一个进程等待。用循环模拟队列。SemaphoreS[n-1];//S[i]的初值为i+1Procedure_i(){intj;DO_PRE_JOB();for(j=n-2;j>=0;j--)P(S[j]);DO_JOB_IN_CRITICAL_SECTION();for(j=0;j<=n-2;j++)V(S[j]);……}二、经典进程同步问题总述:进程同步问题主要分为以下几类:一(生产者-消费者

4、问题);二(读者写者问题);三(哲学家就餐问题);四(爱睡觉的理发师问题);五(音乐爱好者问题);六(船闸问题);七(红黑客问题)等。其中前两类都是用于处理进程之间通信的问题:生产者-消费者问题主要实现进程的消息机制,而读者-写者问题用于实现管道通信。哲学家就餐问题是经典的互斥转同步防止死锁的多资源争夺。理发师问题适合I/O或外部设备的管理,如打印调度。红黑客问题是解决不同条件触发事件的思想方法。I.生产者—消费者问题(初始缓冲区为空)问题:生产者生产产品放到缓冲区,消费者从缓冲区取产品消费。①单缓冲区[书P119](适合单或多生产消费者):同步:生产者不能往满缓冲区放

5、产品(S1(1));消费者不能从空缓冲区取产品(S2(0))。voidProducer(){while(true){生产一个产品;P(S1);申请一个空的缓冲区放到缓冲区;V(S2);返回一个满的缓冲区}}voidConsumer(){while(true){P(S2);申请一个满的缓冲区从缓冲区取一个产品;V(S1);返回一个空的缓冲区消费产品;}}②环行多缓冲区(或无穷缓冲区)单生产消费者[习题P173-13]:同步:生产者不能往满缓冲区放产品(S1(n));消费者不能从空缓冲区取产品(S2(0))。n为缓冲区大小。互斥:设置指示下一个空缓冲区的位置变量(i(0))

6、和指示下一个产品在缓冲区的位置变量(j(0)),由于只有一个生产者和消费者,i和j无须互斥访问。此问题无互斥关系。voidProducer(){while(true){生产了一个产品;P(S1);把产品放入缓冲区;i=(i+1)%n;//无穷缓冲区无须’%n’V(S2);}}voidConsumer(){while(true){P(S2);取一个产品;j=(j+1)%n;//无穷缓冲区无须’%n’V(S1);消费产品;}}③环行多缓冲区多生产消费者[书P120]:同步:生产者不能往满缓冲区放产品(S1(n));消费者不能从空缓冲区取产品(S2(0))。n为缓冲区大小。互

7、斥:设置指示下一个空缓冲区的位置变量(i(0)),生产者之间互斥(mutex1(1));设置指示下一个产品在缓冲区的位置变量(j(0)),消费者之间互斥(mutex2(1))。也可以生产者和消费者之间都互斥(把mutex1和mutex2都换成一个mutex(1))。voidProducer(){while(true){生产一个产品;P(S1);申请一个空的缓冲区P(mutex1);一个生产者申请制造产品放到缓冲区;i=(i+1)%n;指针移动到下一空的缓冲区V(mutex1);释放生产者V(S2);释放一个满的缓冲区}}voidConsu

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。