- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第4章 进的程同步与死锁
4.5 管程 利用信号量机制实现进程同步问题时,需要设置很多信号量,并且对于共享资源的管理分散在各个进程之中,因此,难以防止无意的违反同步操作,造成程序设计的错误或出现死锁。 4.5.1 使用信号的管程 为了解决这类问题,Brinch Hansen和Hoare提出一种高级同步机制——管程(Monitor)。 利用数据抽象地表示系统中的共享资源,而把对该数据实施的操作定义为一组过程。 代表共享资源的数据,以及由对该共享数据实施操作的一组过程所组成的资源管理程序,共同构成了一个操作系统的资源管理模块。 4.5.1 使用信号的管程 管程由四部分组成: 管程的名称; 局部于管程的数据的说明; 对数据进行操作的一组过程; 对局部于管程内部的共享数据赋初值的语句。 4.5.1 使用信号的管程 尽管管程提供了一种实现互斥的简便途径,但这还不够。还需要一种办法使得进程在无法继续运行时被阻塞。例如,在生产者-消费者问题中,很容易将针对缓冲区是满或是空的测试放到管程过程中,但是生产者在发现缓冲区满的时候如何阻塞呢? 解决的方法是引入条件变量以及相关的两个操作原语:wait和signal。当一个管程过程发现它无法继续运行时(例如,生产者发现缓冲区满),它会在某个条件变量上(如full)执行wait操作。该操作导致调用进程自身阻塞,并且还将另一个以前等在管程之外的进程调入管程, 4.5.1 使用信号的管程 管程自动实现对临界区的互斥,因而用它进行并行程序设计比信号量更容易保证程序的正确性。但它也有缺点。由于管程是一个程序设计语言的概念,编译器必须要识别管程并用某种方式实现互斥。然而,C,Pascal和Java及多数编程语言都不支持管程。所以指望这些编译器遵守互斥规则是不可靠的。实际上,如何能让编译器知道哪些过程属于管程,哪些不属于管程,也是个问题。 4.5.2 使用通知和广播的管程 上述管程的定义要求在条件队列中知道有一个进程,当另一个进程为该条件产生signal时,该队列中一个进程立即运行。因此,产生signal的进程必须立即退出管程,或者挂起在管程上。 这种方法有两个缺点: 1. 如果产生signal的进程在管程内还没有结束,则需要做两次切换:挂起进程切换,当管程可用是恢复该进程又切换一次。 2. 与信号相关的进程调度必须非常可靠。当产入一个signal时,来自相应条件队列中的—个进程必须立即被激活,调度程序必须确保在激活前没有别的进程进入管程,否则,进程被激活的条件又会改变。 4.6 死锁 两个进程分别准备打印一个非常大的磁带文件。进程A申请打印机,并得到授权。进程B申请磁带机,也得到授权。现在,A申请磁带机,但该请求在B释放磁带机前会被拒绝。然而,B非但不放弃磁带机,反而去申请打印机,而A在申请到磁带机之前也不会释放打印机。这时,两个进程都被阻塞,并且保持下去,这种状况就是死锁(deadlock)。 4.6.1 死锁的概念 所谓死锁,就是多个进程循环等待它方占有的独占性资源而无限期的僵持下去的局面。显然,如果没有外力的作用,那么死锁涉及到的各个进程都将永远处于阻塞状态。 4.6.1 死锁的概念 当一个计算机系统同时具备下面4个必要条件时,就会发生死锁: 互斥条件:每个资源每次只能分配给一个进程使用,某个进程一旦获得资源,就不准其它进程使用,直到它释放为止。这种独占性资源有打印机、CD-ROM驱动器、平板式绘图仪等。 部分分配(占有且等待)条件:进程由于申请不到所需要的资源而等待时,仍然占据着已经分配到的资源。也就是说,进程并不是一次性地得到所需要的所有资源,而是得到一部分资源后,还允许继续申请新的资源。 不可抢占(非剥夺)条件:任一个进程不能从另一个进程那里抢占资源,即已被占有的资源,只能由占用进程自己来释放。 循环等待条件:存在一个循环的等待序列{P1,P2,P3,…,Pn},其中,P1等待P2所占有的某个资源,P2等待P3所占有的某个资源,……,而Pn等待P1所占有的某个资源,从而形成一个进程循环等待环。 4.6.2 死锁的处理策略 预防死锁:通过破坏上面提及的四个必要条件之一,可以使系统不具备产生死锁的条件。 避免死锁:在为申请者分配资源前先测试系统状态,若把资源分配给申请者会产生死锁,则拒绝分配,否则接受申请,为它分配资源。 检测思索并恢复:允许系统出现死锁,在死锁发生后,通过一定方法加以恢复,并尽可能地减少损失。 忽略死锁:任凭死锁的出现。当系统中出现死锁时,就将系统重新启动。采用这种对策,主要看出现死锁的概率有多大,花费极大的精力去解决系统的死锁问题是否值得。UNIX系统采用这种对策,因为它认为在其系统里,出现死锁的各种可能性都极小。 4.6.3 死锁的预防与避免 破坏互斥条件 破坏部
文档评论(0)