一、构成死锁的必要条件是什么,如何检测死锁,解除死锁
操作系统中的死锁被定义为系统中两个或者多个进程无限期
地等待永远不会发生的条件,系统处于停滞状态,这就是死锁。
产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之
一不满足,就不会发生死锁。
死锁的解除与预防:
理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。
3.银行家算法的思路:
1),进程一开始向系统提出最大需求量.
2),进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量.
3),若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的 剩余资源量,若不超出,则分配,否则等待.
死锁避免的基本思想是:系统对进程发出每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配.这是一种保证系统不进入死锁状态的动态策略
死锁避免和死锁预防的区别在于,死锁预防是设法至少破坏产生死锁的四个必要条件之一,严格的防止死锁的出现,而死锁避免则不那么严格的限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发生死锁.死锁避免是在系统运行过程中注意避免死锁的最终发生.
预防死锁 该策略旨在创造条件预防死锁。对7.3节中讨论的Coffman4个条件的研究表明如果任一条件不满足,就不会出现死锁。Havender最先推荐使用这种策略。本小节将讨论实现该策略的方法以及实现中遇到的问题。
1. 互斥条件
如果系统中的资源可以由多个进程共享,那么就永远不会发生死锁。然而,这种共享不切实际。例如,磁带机、绘图仪或打印机就不能在多个进程之间共享使用。这其中最好的情形就是对打印机使用假脱机技术,即所有打印请求都由一个单独的程序处理。这样可以消除共享请求。当假脱机程序占用打印机时,其他任何进程都不能发送打印机请求,也不能管理打印机。他们可以做的工作就是将数据提交给假脱机程序,以便以后打印。
不幸的是,并非所有的设备都可以使用相同的技术。而且,死锁涉及的除外部I/O设备之外,还包括各种操作系统表、磁盘区和记录等大量资源。此外,不是所有资源都可以采用假脱机这样简单的应用程序进行处理。因此,很难保证避免该条件。
2. 等待条件
禁止进程在已经占用某些资源时等待更多资源,这样可以预防死锁。
这要求进程一开始就声明它期望使用的全部资源。操作系统会检查这些资源是否全部可用,只有可用的时候,才允许该进程开始执行。这种情况下,显然操作系统在分配完资源之后必须更新自己的空闲及可用资源链表。该解决方案很吸引人,但显而易见的是,它不能达到预期效果而且很浪费。如果进程为了更新某些文件需要用8个小时时间,而最后只使用磁带机一分钟以更新控制记录,在整个过程中磁带机都要分配给那个进程。因此,磁带机会空闲8个小时。这期间没有其他的进程可以使用该磁带机。
可以采用该方法的另一种形式。操作系统必须让请求某些资源的进程先放弃已经占用的资源,然后再尝试请求所有要用的资源。如果尝试成功,被放弃的资源才可以重新分配给该进程,这样该进程才可以继续运行。如果失败,被放弃的资源恢复空闲,而进程则必须一直等到那些资源可用为止。每次检查后,进程都放弃已占用的资源,这样就永远不会出现死锁。
该方案也存在很多问题。当进程放弃现有资源之后,也许会有其他一些进程长时间占用一个或多个资源。很容易想象,该策略会导致长时间的延迟、无限期的推迟以及其他不可预测的问题。同样地,这种技术可用于表、信号量等共享资源,但不适用于打印机和磁带机这类资源。想象一下,某个进程在打印到一半的时候放弃使用打印机,而某个其他进程占用该打印机将产生什么样的后果。
3. 非抢占条件
确保不满足"非抢占"条件很困难。如果允许将资源分配给可以强制夺取该资源的进程,也许可以解决死锁问题,但会出现更糟糕的问题。从一个只处理了部分记录的进程强制性地夺走磁带机--因为其他进程请求使用该资源,由此带来的加载/卸载、定位等问题一定令人无法接受。对打印机而言,情形更糟糕。
4. 循环等待条件
显然,克服前三个条件很难,这样就只留下了最后一个条件。如果阻止了循环等待条件,那么也可以阻止死锁。
一种方法是强制进程每次只能占用一种资源。如果它希望使用另一种资源,就必须先放弃占用的资源,然后再请求其他资源。显然,该方法也存在第(3)点中提到的相同缺点。如果进程P占用R1,并且想要使用R2,它就必须先放弃R1,因此另一个进程P2可以获取资源R1。这时将再次出现在进程P1处理了记录的一半之后,将磁带机分配给P2的问题。因此,该解决方案也不能令人满意。
解决该问题的一个更好的方法就是对所有的资源编号,如图7-10所示。
图7-10 对资源的编号
编号 |
资源名称 |
0 |
磁带机 |
1 |
打印机 |
2 |
绘图仪 |
3 |
读卡机 |
4 |
卡片穿孔机 |
现在可以采用一个简单的规则处理循环等待条件。任何进程都必须在执行期间按照编号递增的顺序请求所需的资源。这里再次假定一开始就能获取所有资源的解决方案并不存在。例如,如果进程P1在执行期间的某个时刻需要使用打印机和绘图仪,它必须先请求打印机,然后是绘图仪,因为1<2。
分享到:
相关推荐
实验目的:通过使用银行家算法实现系统资源的分配和安全性检查模拟,深刻理解操作系统的死锁避免算法。 实验原理:银行家算法。 实验仪器:计算机一台。 实验安排:自选编程语言完成“银行家算法”,记录程序运行...
这个程序主要通过模拟系统死锁避免的实现,使用银行家算法来避免死锁加深对死锁避免,系统安全状态等的理解。 (1)输入1执行算法,输入2退出程序,其他输入无效。算法要用到的资源种类有10种,每种资源的数目为1~10...
以经典的避免死锁算法(银行家算法)为设计背景,模拟预防和避免死锁的处理过程
操作系统之--模拟银行家算法实现死锁避免
银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现...
操作系统 死锁 课件下载 操作系统 死锁 课件下载 了解:死锁的检测与恢复 理解:死锁的必要条件、死锁的预防 掌握:死锁的避免——银行家算法
操作系统实验三 预防进程死锁的银行家算法(内含源代码和详细实验报告),详细介绍:http://blog.csdn.net/xunciy/article/details/79239096
从进程同步的概念可以知道,当并发进程需要竞争使用资源或需要相互协作向前推进时,如果... 死锁是所有操作系统都面临着的潜在问题,操作系统除了需要预防死锁、避免死锁外,还需要能够检测死锁,并从死锁中进行恢复。
此代码在Visual C++6.0集成开发环境下无错误;输出格式没有对齐,大家自己调整一下;此代码来源于百度= =,仅供学习参考
1.什么是死锁 2.死锁产生的原因 3.产生死锁的四个必要条件: 4.死锁的避免与预防
操作系统中有关预防死锁的问题
死锁避免——银行家算法的模拟实现 java源代码 java源代码 java源代码 java源代码 java源代码
银行家算法避免进程死锁 可调式文件cpp银行家算法避免进程死锁 可调式文件cpp
有关死锁的介绍。包括死锁的定义,如何处理死锁,死锁如何预防,如何避免等
本次课程设计的内容是采用银行家算法,编写和调试一个仿真模拟银行家算法避免死锁的程序。设计n个并发进程共享3类不同的系统资源,即1类资源、2类资源、3类资源。进程可以动态的申请资源,系统按各个进程的申请动态...
哲学家进餐问题的课程设计报告,包括课程设计背景,程序流图,源代码,分析,注解,以及课程设计总结。相当完整
银行家算法是避免死锁的一种重要方法,本实验要求用级语言编写和调试一个简单的银行家算法程序。
解决死锁问题的三种方法:预防死锁,检测死锁及避免死锁。
安全性算法,银行家算法,避免进程死锁的问题,这是我用C语言编的程序,运行通过。
死 锁 §1 死锁的产生 §2 资源分配图及死锁定理 §3 预防死锁 §4 避免死锁 §5 检测与解除死锁