信号量机制-课堂练习.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE PAGE 11 用wait,signal操作解决进程的同步和互斥问题,绝大部分题目可以按以下步骤解决: ⑴根据题目要求将每个进程的执行过程一步一步描述出来; ⑵分析每个进程每一步的执行条件,将条件一一记录; ⑶比较各个条件,将同一条件归为一个,若条件可以归结为一种资源,设置一个信号量表示; 注意:这里是做题,不是实现系统,所以若某个条件题目中没有加以说明或限制,则删除; ⑷设置信号量初值:若信号量是代表某种资源,则为系统初始时的可使用的资源数或可使用资源的进程数,若为互斥则为“1”; ⑸重新分析每个进程的每个步骤:若该步骤有执行条件涉及信号量A,则在该步骤语句前加入wait(A);若该步骤有执行后某个信号量B会增值,则在该步骤语句后加入signal(B); 注意:若某个步骤前同时有几个wait操作,则一般同步信号量在前,互斥信号量在后; ⑹题目已经做完,最后检查各个进程是否能按题目要求并发执行,若可以,停止;若不可以,检查上述过程,查找错误。 例1 有一个生产者和一个消费者共享容量为n的缓冲器(n均大于1),生产者把生产的物品存入缓冲器,而消费者从缓冲器中取出物品去消费。要求用wait,signal操作对生产者和消费者进行正确管理。 第一步 根据题目要求将每个进程的执行过程一步一步描述出来: 生产者进程 L1: 生产一件产品; 产品放入缓冲; goto L1; 消费者进程 L2: 从缓冲中区走产品; 消费一件产品; goto L2; 第二步 分析每个进程每一步的执行条件,将条件一一记录: 生产者进程: 生产一件产品的条件是有生产产品的原料,在题目中不曾提及,所以该条件不考虑,认为这一步骤没有限制条件; 产品放入缓冲条件是要有产品、缓冲,由于前一步骤已经生产出产品,所以这一步骤执行是肯定有产品,这一步骤的限制条件是有缓冲; 消费者进程: 从缓冲中取走产品条件是缓冲中有产品和,这一步骤的限制条件是缓冲中的产品; 消费产品的条件是应该是已获得产品,由于前一步骤已经获得产品,所以这一步骤执行是肯定有产品的,所以这一步骤没有限制条件; 第三步 比较各个条件,将同一条件归为一个,设置一个信号量表示; 根据第二步分析,本题中有四个限制条件: 一个是缓冲,定义信号量empty; 一个是产品,定义信号量full; 第四步 设置信号量初值: empty,full是资源数量,系统初始状态应该是缓冲均空,无产品,所以empty=n,full=0。 第五步 重新分析每个进程的每个步骤,加入wait,signal操作: 生产者进程: 生产一件产品,无限制条件,且对上述四个信号量无影响; 产品放入缓冲条件是缓冲,所以这条语句前加上wait(empty),这条语句执行完后,应该缓冲中产品会增加一个,所以这条语句后应加入signal(full); 消费者进程: 从缓冲中取走产品条件是缓冲中有产品和无消费者从缓冲中取产品,所以这条语句前加上wait(full)),这条语句执行完后,缓冲会增加一个,所以这条语句后应加入signal(S1); 消费产品无限制条件,且对上述四个信号量无影响。 这样生产者和消费者进程的过程修改为: 生产者进程 L1: 生产一件产品; wait(empty); 产品放入缓冲; signal(full); goto L1; 消费者进程 L2: wait(full); 从缓冲中区走产品; signal(empty); 消费一件产品; goto L2; 用一个数组B描述缓冲,k指示放产品的位置,t指示取产品的位置,则完整的生产者消费者算法描述如下: semaphore empty=n,full=0; item buffer[n]; int in=out=0; void producer() { while (1) { … produce an item in nextp; ... wait(empty); buffer[in]=nextp; in=(in+1) mod n; signal(full); } } void consumer() { while (1) { ... wait(full); nextc=buffer[out]; out=(out+1) mod n; signal(empty); ... consume the item in nextc; … } } main() { cobegin { producer(); consumer(); } } 第六步 检查: 其中wait(S1)和signal(S1)之间的程序段是各生产者的相关临界区

文档评论(0)

44422264 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档