标签:另一个 长度 释放 两种 资源释放 回滚 申请 nis 没有
死锁:如果所申请的资源被其他等待进程占有,那么该等待进程有可能再也无法改变状态。
如果一个系统中以下四个条件同时成立,那么就能引起死锁。
P1 -->R1表示申请边,R1 --> P2表示分配边。
如果资源分配图没有环,那么系统就不处于死锁状态。如果有环,那么系统可能会也可能不会处于死锁状态。
一般来说,处理死锁问题有三种方法:
第三种方法被大多数操作系统所采用,包括Linux和Windows。
确保至少有一个必要条件不成立。这些方法通过限制如何申请资源的方法来预防死锁。缺点是设备利用率低和系统吞吐量低。
要求操作系统实现得到有关进程申请资源和使用资源的额外信息。
最简单且最有用的模型要求,每个进程都应声明可能需要的每种类型资源的最大数量。
如果系统能按照一定顺序为每个进程分配资源(不超过它的最大需求),仍然避免死锁,那么系统的状态就是安全的。更正式的说,只有存在一个安全序列,系统才处于安全状态。
安全状态不是死锁状态,相反,死锁状态是非安全状态。不是所有的非安全状态都能导致死锁。
如果有一个资源分配系统,它的每种资源类型只有一个实例。
引入需求边,用虚线表示。Pi ---> Rj 表示进程Pi 可能在将来的某个时刻申请资源Rj。系统资源的需求应事先说明。
采用环检查算法,复杂度O(N2)。
对于每种资源类型有多个实例的资源分配系统,资源分配图算法就不适用了。
当一个新的进程进入系统时,它应声明可能需要的每种类型资源实例的最大数量,这个数量不能超过系统资源的总和。当用户申请一组资源时,系统应确定这些资源的分配是否仍会使系统处于安全状态。如果会,就可以分配资源;否则,进程应该等待,直到某个其他进程释放足够多的资源为止。
数据结构:n为系统进程的数量,m为资源类型的种类
当一个进程申请使用资源时,银行家算法通过先试探分配给该进程资源,然后通过安全性算法判断分配后的系统是否处于安全状态,若不安全,则试探分配作废,让该进程继续等待。
1. 初始化 Work = Allocation 和 Finish[ i ] = false。
2. while ( true ){
if ( 能找到 i 使其满足:a. Finish[ i ] == false && b.Needi <= Work ) {
Work = Work + Allocition i ;
Finish [ i ] = true;
}
else
exit();
}
3. 如果所有Finish [ i ] = true,那么系统处于安全状态。
...
当检测算法确定已有死锁时,可以通知管理员死锁发生,人工处理。也可以让系统自动恢复。打破死锁的两种选择:简单地中止一个或多个进程来打破循环等待;从一个或多个死锁进程那里抢占一个或多个资源。
不断地抢占一些进程的资源以便给其他进程使用,直到死锁循环被打破。但要处理三个问题:
标签:另一个 长度 释放 两种 资源释放 回滚 申请 nis 没有
原文地址:https://www.cnblogs.com/astonc/p/12154483.html