4.2死锁预防如上节所述,出现死锁有4个必要条件。在理论上,只要确保.doc

4.2死锁预防如上节所述,出现死锁有4个必要条件。在理论上,只要确保.doc

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

4.2死锁预防 如上节所述,出现死锁有4个必要条件。在理论上,只要确保其中一个必要条件不成立,就能预防死锁的发生。下面通过详细讨论这4个必要条件来研究死锁预防的方法。 1. 互斥 对于非共享资源,必须要有互斥条件。例如,一台打印机不能同时为多个进程所共享。另一方面,共享资源不要求互斥访问,因此不会涉及死锁。共享资源的一个很好的例子是只读文件。如果多个进程试图同时打开只读文件,那么它们能同时获得对只读文件的访问。进程决不需要等待共享资源。然而,通常不能通过否定互斥条件来预防死锁:有的资源本身的特征就决定了它就是非共享的。 结论:通过破坏“互斥”条件来预防死锁,不可行。 2. 占有并等待 为了确保占有并等待条件不会在系统内出现,必须保证:当一个进程申请一个资源时,它不能占有其他资源。一种可以使用的方法是要求每个进程在执??前先申请并获得它所需要的所有资源。可以实现通过要求申请资源的系统调用在所有其他系统调用之前进行。 另外一种方法是允许进程在不占有任何资源时才可以申请资源。一个进程可申请一些资源并使用它们。然而,在它申请更多其他资源之前,它必须先释放其现已分配的所有资源。 为了说明这两种方法之间的差别,考虑一个进程,它将数据从DVD驱动器复制到磁盘文件,并对磁盘文件进行排序,再将结果打印到打印机上。如果所有资源必须在进程开始之前申请,那么进程必须一开始就申请DVD驱动器、磁盘文件和打印机。在其整个执行过程中,它会一直占有打印机,尽管它只在结束时才需要打印机。 第二种方法允许进程在开始时只申请DVD驱动器和磁盘文件。它将数据从DVD复制到磁盘,再释放DVD驱动器和磁盘文件。然后,进程必须再申请磁盘文件和打印机。当数据从磁盘文件复制到打印机之后,它就释放这两个资源并终止。 虽然第二种方法对第一种方法进行了改进,但是这两种方法有两个主要缺点。第一,资源利用率(resource utilization)可能比较低,因为许多资源可能已分配,但是很长时间没有被使用。例如,在所给的例子中,只有确认数据始终在磁盘文件上的情况下,才可以释放DVD驱动器和磁盘文件,并再次申请磁盘文件和打印机资源。否则,不管采用哪种协议,必须在开始之前申请所有资源。第二,可能发生饥饿。当一个进程需要多个常用资源时,可能会永久等待,因为其所需要的资源中很可能至少有一个已分配给其他进程,总是无法凑完整。 结论:通过破坏“占有并等待”条件来预防死锁,会引起资源利用率大幅度下降,并可能诱发饥饿现象。 3. 非抢占 第三个必要条件是对己分配的资源不能抢占。为了确保这一条件不成立,可以使用如下方法:如果一个进程占有资源并申请另一个不能立即分配的资源,那么其现已分配的资源都可被抢占。换句话说,这些资源都被隐含地释放了。被抢占的这些资源会被操作系统放置到进程所等待的资源链表上。只有当进程获得其原有资源和所申请的新资源时,进程才可以重新执行。 换句话说,如果一个进程申请一些资源,那么首先检查它们是否可用。如果可用,那么就分配它们。如果不可用,那么检查这些资源是否已分配给其他等待额外资源的进程。如果是,那么就从等待进程中抢占这些资源,并分配给申请进程。如果资源不可用且也不被其他等待进程占有,那么申请进程必须等待。当一个进程处于等待时,如果其他进程申请其拥有资源,那么该进程的部分资源可以被抢占。一个进程要重新执行,它必须分配到其所申请的资源,并恢复其在等待时被抢占的资源。 这个方法通常可用于那些状态可以保存和恢复的资源,如CPU寄存器和内存。但它一般不适用于其他资源,如打印机和磁带驱动器。 结论:通过破坏“非抢占”条件来预防死锁,不是一个通用的方法。 4. 循环等待 死锁的第4个也是最后一个条件是循环等待。一个确保此条件不成立的方法是对所有资源类型进行完全排序,且要求每个进程按递增顺序来申请资源。 设R={R1, R2,…,Rm}为资源类型的集合。为每个资源类型分配一个唯一整数来允许比较两个资源以确定其先后顺序。可以定义一个函数F:R?N,其中N是自然数的集合。例如,如果资源类型R的集合包括磁带驱动器、磁盘驱动器和打印机,那么函数F可以定义如下: F(tape drive) = 1 F(disk drive) = 5 F(printer) = 12 有了这个函数,可以采用如下方法以预防死锁:每个进程只能按递增顺序申请资源,即一个进程开始可申请任何数量的资源类型Ri的实例。之后,当且仅当 F(Rj) F(Ri) 时,该进程才可以申请资源类型Rj的实例。如果需要同一资源类型的多个实例,那么对它们必须一起申请。例如,对于以上给定函数,一个进程需要同时使用磁带驱动器和打印机,那么就必须先申请磁带驱动器,再申请打印

文档评论(0)

170****0532 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8015033021000003

1亿VIP精品文档

相关文档