操作系统(死锁)

来源:互联网 发布:台湾军事实力 知乎 编辑:程序博客网 时间:2024/06/05 14:51

死锁:一组进程中,每个进程都无限等待被该组进程中另一个进程所占有的资源,从而永远无法得到资源的状态。

死锁发生会浪费大量的系统资源,甚至导致系统崩溃。

参与死锁的所有进程都在等待资源,并使当前系统中所有进程的子集。

死锁产生的原因:资源数量有限、锁和信号量错误使用 

产生死锁的必要条件:1)互斥使用(资源独占);2)占有且等待(请求和保持,部分分配);3)不可抢占(不可剥夺);4)循环等待

资源分配图:资源类(用方框表示);资源实例(用方框中的黑圆点表示);进程(用圆圈中加进程名表示);分配边:资源实例->进程;申请边:进程->资源边。

如果资源分配图中没有环路,则系统中没有死锁,如果图中存在环路,则系统中可能存在死锁。如果每个资源类中只包含一个资源实例,则环路是死锁存在的充分必要条件。

资源分配图简化步骤:1)找一个非孤立点、且只有分配边的进程节点,去掉分配边,将其变为孤立节点;2)在把相应的资源分配给一个等待该资源的进程,即该进程的申请边变为分配边。

解决死锁方法:鸵鸟算法。

不让死锁发生方法:1)死锁预防(静态策略:设计合适的资源分配算法,不让死锁发生。本质:防止产生死锁的四个必要条件中任何一个条件的发生。);2)死锁避免(动态策略:不让死锁发生为目标,跟踪并评估结果决策是否分配)。

死锁检测与解除。

银行家算法

应用条件:1)在固定数量的进程中共享数量固定的资源;2)每个进程预先指定完成工作所需的最大资源数量;3)进程不能申请比系统中可用资源总数还多的资源;4)进程等待资源的时间是有限;5)如果系统满足了进程对资源的最大需求,那么进程应该在有限的时间内使用资源,然后归还给系统。

当进程Pi提出资源申请时,系统执行下列步骤:

1)若Request[i] <= Need[i],转2);否则,报错返回;2)当Request[i] <= Available,转3),否则,进程等待;3)假设系统分配了资源,则有:

Available = Available - Request[i];    Allocation[i] = Allocation[i] + Request[i];   Need[i] = Need[i] - Request[i];

若系统新状态是安全的,则分配完成,若系统新状态是不安全的,则回复原来状态,进程等待。

安全检查步骤:

1)Work = Available; Finish = false

2)寻找满足条件的i:a) Finish[i] == false; b) Need[i] <= Work;如果不存在,转4)

3)Work = Work + Allocation[i]; Finish[i] = true,转2)

4)若对所有i,Finish[i] == true,则系统处于安全状态,否则系统处于不安全状态。

死锁检测:允许死锁发生,但是操作系统会不断监视系统进展情况,判断死锁是否真的发生,一旦死锁发生,则采取专门的措施,解除死锁并以最小的代价恢复操作系统运行。

死锁解除方法:

1)撤销所有死锁进程;2)进程回退再启动;3)按照某种原则逐一撤销死锁进程;4)按照某种原则逐一抢占资源(资源被抢占的进程必须回退到之前的对应状态)。

哲学家就餐问题解决方法:1)最多允许4个哲学家同时坐在桌子周围;2)仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子;3)给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之。


0 0
原创粉丝点击