[TOC]
资源分配与调度
主要内容
资源的概念
死锁的概念
产生死锁的原因和必要条件
解决死锁问题的策略
重点
死锁的概念
产生死锁的原因和必要条件
课堂知识小结
哲学家就餐问题
五个人,五支筷子。
自然语言下的伪代码
对人和筷子编号,并利用P-V操作写出伪代码
但这明显会有缺陷:
假设每一个人都取了左手的筷子,于是都想着拿右手的筷子,但右手没有筷子了,而只有当其他人吃完饭才释放筷子,但所有人都无法吃饭,于是发生死锁!
死锁定义
两个或多个进程无限期地等待永远不会发生的条件的一种系统状态。【结果:每个进程都永远阻塞】
另一个定义:
在两个或多个进程中,每个进程都已持有某种资源,但又继续申请其它进程已持有的某种资源
即每个进程都拥有其运行所需的部分资源,但又不足够运行,从而每个进程都不能向前推进,陷于阻塞状态。这种状态称死锁
死锁的起因
(1)系统资源有限
资源数目不足以满足所有进程的需要,引起进程对资源的竞争而产生死锁。
(2)并发进程的推进顺序不当
进程在运行过程中,请求和释放资源的顺序不当,导致进程产生死锁
假设这里运行到第5行时,转去运行另外一个进程,发生了阻塞,但没有发生死锁。
可见资源匮乏,不一定产生死锁
假设A运行到第四行(还没有到第四行),转去运行B,B运行到第四行,需要资源i,于是转向A,但A运行到第四行时又需要资源j,不然不能继续从而释放资源i,这样形成了死锁。
关于死锁的一些结论
死锁的必要条件
(1) 互斥条件
资源具有独占性,进程互斥使用资源。
(2)不剥夺条件
进程在释放资源前(即访问完)不能被其他进程剥夺。
(3)部分分配条件
进程所需资源逐步分配,需要时申请和分配。
占有一些资源,同时申请新资源。
(4)环路条件
多个进程构成环路:环中每个进程已占用的资源被前一进程申请,而自己所需新资源又被环中后一进程所占用
对于之前的哲学家就餐问题,就是一个环路条件。
假如我们限定最多4个人就餐,就不会发生死锁,其实就是破坏了环路条件
解决死锁的策略
预防死锁
避免死锁
检测死锁
恢复死锁
预防死锁
避免死锁
在资源的分配过程中,用某种方法分析该次分配是 否可能导致死锁?若会则不分配;若不会就分配(实现难度大)
检测和恢复死锁
允许死锁发生,但可通过检测机制及时检测出死锁状态,并精确确定与死锁有关的进程和资源,然后采取适当措施,将系统中已发生的死锁清除,将进程从死锁状态解脱出来(实现难度大)
预先静态分配法(课件要求MOOC自学)
目的:破坏部分分配条件
策略:
全部分配法:进程运行前将所需全部资源一次性分配给它。因此进程在运行过程中不再提出资源请求,从而避免出现阻塞或者死锁
进程仅当其所需全部资源可用时才开始运行
改进:资源分配的单位由进程改为程序步
有序资源分配法(MOOC)
分配策略:
分配资源时检查资源序号是否符合递增规定
若不符合则拒绝该申请,并撤销该进程。
若符合且资源可用则予以分配
若符合但资源不可用则不分配,陷于阻塞
为什么不会发生死锁?(证明)
假设有多个进程,其中有一个进程,已经占有资源M(所有 进程占有资源中最大的那个),若不需要申请资源,可顺利运行,并将资源释放;若还需要申请,肯定申请大于M的资源,肯定是可以获得的,又可以运行并释放。
Win和Linux对死锁解决方案
没有方案:鸵鸟策略(像一个鸵鸟一样,无视死锁的发生)
简答
1.什么是死锁或死锁的定义是什么
两个或多个进程中,每个进程都持有某种资源,但又继续申请其他进程已持有的某种资源,此时每个进程都拥有其运行所需的一部分资源但又都不够,结果每个进程永远陷入阻塞。这种状况成为死锁
2.在Linux或Windows的实际应用中,用户常说的“死机”或“宕机”或“程序卡住”或“系统卡住,键鼠没有任何响应”与本章的“死锁”是同一问题吗?
不是。
“死机”或“宕机”或“系统卡住,键鼠没有任何响应”可能由于多种原因引起,比如由于进程死锁、程序运行错误导致进程长期陷入阻塞、操作系统无法满足进程申请的资源等因素引起。
死锁受影响的仅仅是死锁的进程以及所涉及的部分资源,未必会引起“死机”或“宕机”。
3.如何证明“参与死锁的进程至少有2个已经占有资源”
反证法。只有一个资源的话,占有该资源的进程不会由于等待其他资源而陷入死锁,因此发生死锁必须有两个以上资源
4.死锁的四个必要条件是哪些
互斥条件:进程互斥使用资源,资源具有独占性。
不剥夺条件:进程在访问完资源前不能被其他进程强行剥夺。
部分分配条件:进程边运行边申请资源,临时需要临时分配。
环路条件:多个进程构成环路,环中每个已占用资源被前一进程申请,自己所申请资源被后一进程占用
5.如何证明“按有序资源分配法分配资源并发进程不会死锁”
有序资源分配法实质上是为不同进程的资源申请标注了优先级,按先到先得的顺序排列,保证了最靠前的进程对所需的资源有最高访问权限,不会出现每个进程都拥有其运行所需的一部分资源但另一部分资源被其他进程占用的情况。
6.在Linux或Windows是如何处理死锁的
由于目前没有一种高效稳定处理死锁的方法,因此Linux或Windows并没有对死锁进行预防和处理的功能,需要使用者主动避免。(鸵鸟策略)