[工学]第二章B - 进程互斥和同步.pptVIP

  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文档。上传文档
查看更多
[工学]第二章B - 进程互斥和同步

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * P.V操作优点: 简单,而且表达能力强(用P.V操作可解决任何同步互斥问题) 缺点: “不够安全;P.V操作使用不当会出现死锁;遇到复杂同步互斥问题时实现复杂 P.V 操作的优缺点 * 2.4.2.2 信号量集 一段处理代码需要同时获取两个或多个临界资源――可能死锁:各进程分别获得部分临界资源,然后等待其余的临界资源,各不相让 基本思想:在一个原语中,将一段代码同时需要的多个临界资源,要么全部分配给它,要么一个都不分配,称为Swait(Simultaneous Wait)。在Swait时,各个信号量的次序并不重要,虽然会影响进程归入哪个阻塞队列,但是由于是对资源全部分配或不分配,所以总有进程获得全部资源并在推进之后一起释放资源,因此不会死锁。 信号量集用于同时需要多种资源时的信号量操作 1. AND型信号量集 AND型信号量集用于同时需要多种资源且每种只占用一个时的信号量操作; * Swait(S1, S2, …, Sn) //P原语; { while (TRUE) { if (S1 =1 S2 = 1 … Sn = 1) { //满足资源要求时的处理; for (i = 1; i = n; ++i) --Si; //注:与wait的处理不同,这里是在确信可满足 //资源要求时,才进行减1操作; break; } else { //某些资源不够时的处理; 调用进程进入第一个小于1信号量的等待队列Sj.queue; 阻塞调用进程; } } } Swait * Ssignal(S1, S2, …, Sn) { for (i = 1; i = n; ++i) { ++Si; //释放占用的资源; for (each process P waiting in Si.queue) //检查每种资源的等待队列的所有进程; { 从等待队列Si.queue中取出进程P; if (判断进程P是否通过Swait中的测试) //注:与signal不同,这里要进行重新判断; { //通过检查(资源够用)时的处理; 进程P进入就绪队列; } else { //未通过检查(资源不够用)时的处理; 进程P进入某等待队列; } } } } Ssignal * 2. 一般“信号量集” 一次需要N个某类临界资源时,就要进行N次wait操作--低效又可能死锁 基本思想:在AND型信号量集的基础上进行扩充:进程对信号量Si的测试值为ti(用于信号量的判断,即Si = ti,表示资源数量低于ti时,便不予分配),占用值为di(用于信号量的增减,即Si = Si - di和Si = Si + di) Swait(S1, t1, d1; ...; Sn, tn, dn); Ssignal(S1, d1; ...; Sn, dn); 一般信号量集用于同时需要多种资源、每种占用的数目不同、且可分配的资源还存在一个临界值时的处理; * Swait(S1, t1,d1,…, Sn,tn,dn) //P原语; { while (TRUE) { if (S1 =t1 S2 =t2 … Sn = tn) { //满足资源要求时的处理; for (i = 1; i = n; ++i) Si= Si-di; //注:与wait的处理不同,这里是在确信可满足 //资源要求时,才进行减di操作; break; } else { //某些资源不够时的处理; 调用进程进入第一个小于di信号量的等待队列Sj.queue; 阻塞调用进程; } } } Swait * Ssignal(S1, d1,S2,d2, …, Sn,dn) { for (i = 1; i = n; ++i) { Si= Si+di; //释放占用的资源; for (each process P waiting in Si.queue)

文档评论(0)

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

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

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档