进程间通信例题

上传人:第*** 文档编号:51688204 上传时间:2018-08-15 格式:PPT 页数:8 大小:103KB
返回 下载 相关 举报
进程间通信例题_第1页
第1页 / 共8页
进程间通信例题_第2页
第2页 / 共8页
进程间通信例题_第3页
第3页 / 共8页
进程间通信例题_第4页
第4页 / 共8页
进程间通信例题_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《进程间通信例题》由会员分享,可在线阅读,更多相关《进程间通信例题(8页珍藏版)》请在金锄头文库上搜索。

1、例1. 有4个进程A、B、C、D, 进程A通过一个缓冲区不断向进程B、C 、D发送消息,A每次向缓冲区送入一个消息之后,必须等待进程B 、C、D都取走后才可以发送下一个消息。B、C、D对进程A送入的 每个消息各取一次。适用信号量完成四个进程的并发通信。分析: 缓冲区只能存放一个消息,该消息应该被B,C,D三个进程取走且不能重复 取。因此,设三个信号量Sb, Sc, Sd,用于保证三个接收进程的同步; 设置一个信号量S,用于表示缓冲区当前是否可用,初始S=1,用于制约发 送消息的进程A。 由于三个接收进程必须都取到消息后,发送者进程才可发送下一个消息。 因此需要对接收进程每次的接收做计数。因此,

2、设一个计数器R。初始 R=0,进程每取走一次消息,R+; 由于R变量为三个取消息的进程所共同操作,为共享变量,设mutex为二元 信号量,用于保护R变量的互斥访问。typedef int Semaphore; Semaphore Sb, Sc, Sd; Semaphore mutex=1; Semphore S =1; Sb=Sc=Sd=0; int R=0;/ 进程A void sender() while(true) down(S);send_message();up(Sb);up(Sc);up(Sd); / 进程B void receiver1() while(true) down(Sb

3、);receive_mess();down(mutex);R = R+1;up(mutex);if( R=3) up(S); / 进程C void receiver2() while(true) down(Sc);receive_mess();down(mutex);R = R+1;up(mutex);if( R=3) up(S); / 进程D void receiver3() while(true) down(Sd);receive_mess();down(mutex);R = R+1;up(mutex);if( R=3) up(S); 例2. 设有8个进程P1,P2,P8,它们有如图所示的

4、优先关系,适用信 号量实现这些进程的同步。分析: 上图给出了若干个进程先后执行的顺序要求,例如:P6进程必须在 P2和P3进程执行完才能执行。 对于进程执行的先后顺序,可定义信号量来约束进程的阻塞等待与 唤醒。信号量Sij表示进程Pj需要在进程Pi运行完成后才能运行。 定义信号量: S12, S12,S14, S26,S36, S38, S47, S57, S78.P1P2P3P4P6 P8P7P5typedef int Semaphore; Semaphore s12, s13,s14, s26,s36,s47,s57,s38,s78; S12= s13=s14=s26=s36=s47=s5

5、7=s38=s78=0;/ 进程P1 Void P1() up(s12);up(s13);up(s14); / 进程P2 Void P2() down(s12);up(s26); / 进程P3 Void P3() down(s13);up(s36);up(s38); / 进程P4 Void P4() down(s14);up(s47); / 进程P5 Void P5() up(s57); / 进程P6 Void P6() down(s26);down(s36); / 进程P7 Void P7() down(s47);down(s57);up(s78); / 进程P8 Void P4() dow

6、n(s38);down(s78); 例3. 有一个仓库,可以存放A和B两种产品,仓库的容量如走大。但 要求:(1) 每次只能放入一种产品(A或B)(2) N N B产品数量-A产品数量= N-1同理: A产品数量-B产品数量=M-1. 以上约束条件可理解为:A产品数量不能比B产品少N个,且不能比 B产品多个。 . 因此设置两个信号量:Sa和Sb,初始值分别为:Sa=M-1, Sb=N -1。typedef int Semaphore; Semaphore Sa, Sb; Sa=M-1; Sb=N-1;void store() while(true)produce x; If( x is typ

7、e of A) then down(Sa);down(mutex);存放A;up(Sb);up(mutex); If( x is type of B) then down(Sb);down(mutex);存放B;up(Sa);up(mutex); 例4. 某工厂有两个生产车间和一个装配车间,两个生产车间分别生产 A、B两种零件,装配车间的任务是把两种零件组装成产品。两个 生产车间每生产一个零件后都要分别把它们送到装配车间的货架F1 、F2上。F1存放零件A,F2存放零件B。F1和F2均可存放10个。 装配工人每次从货架上取一个A零件和一个B零件组装成产品。请 描述三个车间的过程。 分析: 显然

8、,这是一个生产者-消费者问题; 不同的是,生产者是两个,分别是生产零件A的车间和生产零件B 的车间,消费者是一个,是装配车间。 基于上述问题,可定义4个信号量: S1:表示F1上可放零件A的空位置数,初始值为10; S2:表示F1上已有零件A的数量,初始值为0; S3:表示F2上可放零件B的空位置数,初始值为10; S4:表示F2上已有零件B的数量,初始值为0; 另外,为保证零件A和零件B的存取,分别设置一个二元信号量: mutex1表示对零件A的存取的约束; mutex2表示对零件B的存取的约束;typedef int Semaphore; Semaphore S1,S2,S3,S4; Se

9、maphore mutex1, mutex2; S1=S3=10; S2=S4=0; mutex1=mutex2=1;/ 生产车间1 void workshop1() while (true)produce an A;down(S1);put A onto F1;up(S2); / 生产车间2 void workshop2() while (true)produce a B;down(S3);put B onto F2;up(S4); / 装配车间 void assemb_shop() while (true)down(S2);fetch an A from F1;up(S1);down(S4);fetch a B from F2;up(S3);assemble A and B;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号