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

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统 进程间通信 例题 习题

例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变量的互斥访问。 typedef int Semaphore; Semaphore Sb, Sc, Sd; Semaphore mutex=1; Semphore S =1; Sb=Sc=Sd=0; int R=0; 例2. 设有8个进程P1,P2,…,P8,它们有如图所示的优先关系,适用信号量实现这些进程的同步。 分析: 上图给出了若干个进程先后执行的顺序要求,例如:P6进程必须在P2和P3进程执行完才能执行。 对于进程执行的先后顺序,可定义信号量来约束进程的阻塞等待与唤醒。信号量Sij表示进程Pj需要在进程Pi运行完成后才能运行。 定义信号量: S12, S13,S14, S26,S36, S38, S47, S57, S78. typedef int Semaphore; Semaphore s12, s13,s14, s26,s36,s47,s57,s38,s78; S12= s13=s14=s26=s36=s47=s57=s38=s78=0; 例3. 有一个仓库,可以存放A和B两种产品,仓库的容量如走大。但要求: (1) 每次只能放入一种产品(A或B) (2) –NA产品数量-B产品数量M 其中,N和M是正整数。试用信号量描述“存放A”,“存放B”两种入库过程。 分析: 1. 从条件(1)得知,入库过程为互斥过程,定义信号量mutex来控制; 通过条件(2)得知,仓库中A和B两种产品的入库量应该符合如下两个条件的“与”关系: -NA产品数量-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。 typedef int Semaphore; Semaphore Sa, Sb; Sa=M-1; Sb=N-1; void store() { while(true){ produce x; } } 例4. 某工厂有两个生产车间和一个装配车间,两个生产车间分别生产A、B两种零件,装配车间的任务是把两种零件组装成产品。两个生产车间每生产一个零件后都要分别把它们送到装配车间的货架F1、F2上。F1存放零件A,F2存放零件B。F1和F2均可存放10个。装配工人每次从货架上取一个A零件和一个B零件组装成产品。请描述三个车间的过程。 分析: 显然,这是一个生产者-消费者问题; 不同的是,生产者是两个,分别是生产零件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; Semaphore mutex1, mutex2; S1=S3=10; S2=S4=0; mutex1=mutex2=1; * // 进程A void sender() { while(true) { down(S); send_message(); up(Sb); up(Sc); up(Sd);

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档