操作系统 进程间通信 例题 习题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

// 进程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,它们有如图所示的优先关
// 进程P6 Void P6() { down(s26); down(s36); }
// 进程P8 Void P4() { down(s38); down(s78); }
例3. 有一个仓库,可以存放A和B两种产品,仓库的容量如走大。但要
求: (1) 每次只能放入一种产品(A或B) (2) –N<A产品数量-B产品数量<M 其中,N和M是正整数。试用信号量描述“存放A”,“存放B”两种 入库过程。 分析: 1. 从条件(1)得知,入库过程为互斥过程,定义信号量mutex来控制; 2. 通过条件(2)得知,仓库中A和B两种产品的入库量应该符合如下 两个条件的“与”关系: -N<A产品数量-B产品数量 存放的A产品不能比B产品少N个,即: B产品数量- A产品数量 > N B产品数量-A产品数量>= N-1 同理: A产品数量-B产品数量<=M-1. 以上约束条件可理解为:A产品数量不能比B产品少N个,且不能比 B产品多M个。 3. 因此设置两个信号量:Sa和Sb,初始值分别为:Sa=M-1, Sb=N-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。 由于三个接收进程必须都取到消息后,发送者进程才可 发送下一个消息。因此需要对接收进程每次的接收做计 数。因此,设一个计数器R。初始R=0,进程每取走一次 消息,R++; 由于R变量为三个取消息的进程所共同操作,为共享变 量,设mutex为二元信号量,用于保护R变量的互斥访 问。
系,适用信号量实现这些进程的同步。
P1 P5 P2 P3 P4
P6
P8
P7
分析: 1. 上图给出了若干个进程先后执行的顺序要求,例如:P6 进程必须在P2和P3进程执行完才能执行。 2. 对于进程执行的先后顺序,可定义信号量来约束进程的 阻塞等待与唤醒。信号量Sij表示进程Pj需要在进程Pi运 行完成后才能运行。 3. 定义信号量: S12, S13,S14, S26,S36, S38, S47, S57, S78.
// 进程B void receiver1() { while(true) { down(Sb); 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); } }
typedef int Semaphore; Semaphore S1,S2,S3,S4; Semaphore 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); } }
typedef int Semaphore; Semaphore s12, s13,s14, s26,s36,s47,s57,s38,s78; S12= s13=s14=s26=s36=s47=s57=s38=s78=0;
// 进程P1 Void P1() { up(s12); up(s13); up(s14); } // 进程P5 Void P5() { up(s57); }
typedef int Semaphore; Semaphore Sa, Sb; Sa=M-1; Sb=N-1;
void store() { while(true){ produce x; If( x is type 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); }
1.
2.
3.
Hale Waihona Puke Baidu
4.
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); } }
// 进程P2 Void P2() { down(s12); up(s26); }
// 进程P3 Void P3() { down(s13); up(s36); up(s38); } // 进程P7 Void P7() { down(s47); down(s57); up(s78); }
// 进程P4 Void P4() { down(s14); up(s47); }
// 生产车间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; } }
例4. 某工厂有两个生产车间和一个装配车间,两个生产车间分别生产A、
B两种零件,装配车间的任务是把两种零件组装成产品。两个生产 车间每生产一个零件后都要分别把它们送到装配车间的货架F1、 F2上。F1存放零件A,F2存放零件B。F1和F2均可存放10个。装 配工人每次从货架上取一个A零件和一个B零件组装成产品。请描 述三个车间的过程。 分析: 1. 显然,这是一个生产者-消费者问题; 2. 不同的是,生产者是两个,分别是生产零件A的车间和生产零件B 的车间,消费者是一个,是装配车间。 3. 基于上述问题,可定义4个信号量: S1:表示F1上可放零件A的空位置数,初始值为10; S2:表示F1上已有零件A的数量,初始值为0; S3:表示F2上可放零件B的空位置数,初始值为10; S4:表示F2上已有零件B的数量,初始值为0; 另外,为保证零件A和零件B的存取,分别设置一个二元信号量: mutex1表示对零件A的存取的约束; mutex2表示对零件B的存取的约束;
相关文档
最新文档