操作系统第七章学习笔记
死锁
进程使用资源的顺序
1.
申请
2.
使用
3.
释放
死锁状态:一组进程中的每个进程都在等待一个事件,而这个事件只能由这一组进程的另一进程引起。
死锁的四个必要条件
1.
互斥:至少有一个资源必须处于非共享模式,即一次只有一个进程使用。如果另一进程申请该资源,必须等到该资源被释放为止。
2.
占有并等待:一个进程必须占有至少一个资源,并等待另一资源,而该资源为其他进程所占有
3.
非抢占:资源不能被抢占,即只能在进程完成后自动释放
4.
循环等待:有一组等待进程{p0,p1,p2………pn}p0等待的资源为p1占有,p1的资源为p2占有………pn的资源为p0占有。
资源分配图
Pi->Rj为申请边
Rj->Pi为分配边
在图中,用圆形表示进程Pi,用矩形表示资源类型Rj。
当进程Pi申请资源类型Rj的一个实例时,就在分配图中加一条申请边,申请可以得到满足时,申请边转换成分配边。当进程不再需要访问资源时,它就释放资源,删除分配边。
如果分配图没有环,那么没有进程死锁。有环,可能有死锁。如果只有一个实例,那么有环就意味着有死锁。
死锁处理方法:
死锁预防:避免死锁,确保系统不会进入死锁状态
运行进入死锁,然后检测并恢复
忽视这个问题
死锁预防:确保死锁的四个必要条件之一不成立
l 互斥:对于非共享资源,必须要有互斥条件。
l 占有并等待:一个进程申请一个资源时,他不能占有其他资源
1.
每个进程在执行前申请并获得所有资源
2.
在进程没有资源时才可以申请资源
l 非抢占:对已分配的资源不能抢占
l 协议:如果进程占有资源并申请另一个不能立即被分配的资源,那么其现在已分配的资源都可被抢占。一个进程申请资源,可用就分配,不可用,检查是否分配给你其他等待额外资源的进程,如果是,就抢占资源。
l 循环等待:解决:对所有资源类型进行完全排序。且要求每个进程按递增顺序来申请资源。
死锁避免
每次申请要求系统考虑现有可用资源,现已分配资源和每个进程将来申请与释放的资源,以决定当前申请是否满足或必须等待,从而避免死锁发生的可能性。死锁避免算法动态地检测资源分配状态以确保循环等待条件不可能成立。
安全状态:
存在安全序列,那么系统处于安全状态。按一定序列执行,可以顺序执行完毕的序列称为安全序列。
不是所以不安全都能导致死锁状态,不安全状态可能导致死锁。
资源分配图算法:
一个实例。无环即安全,有环就是不安全状态。
银行家算法:
当用户申请一组资源时,系统必须确定这些资源的分配是否仍会使系统处于安全状态。如果是,就可分配资源,否则,进程必须等待直到某个其他进程释放足够资源为止。
Available:长度为m的向量,表示每周资源现有实例的数量
Max:n*m矩阵,定义每个进程的最大的需求。Max【i】【j】=k,则表示进程Pi最多可申请k个资源类型的Rj实例。
Allocation:n*m矩阵,定义每个进程现在所分配的各种资源类型的实例数量。
Need:n*m矩阵,表示每个进程还需要的剩余资源。
安全性算法:
确定计算机是否处于安全状态:
l 设work和finish分别为长度m和n的向量。Work=available。且对于i=0,1,2……finish【i】=false。
l 查找这样的i使满足finish【i】=false;need【i】<=work;如果没有这样的【i】,转至第四步,否则转至第三步。
l Work=work+allocation【i】;finish【i】=true;
l 对所有i,finish【i】=true,则系统处于安全状态,否则。系统不安全。
资源请求算法
设request[i]为进程pi的请求向量,如果request【i】【j】=k,那么进程pi需要资源类型rj的实例为k。
l 若request【i】<=need【i】。转至第二步,否则产生出错条件,超过了最大请求
l 如果request【i】<=available,那么转至第三步,否则,pi必须等待有资源可用
l 假定系统可以分配给进程pi所请求的资源,并按如下方式修改状态: available=available-request;
Allocation=allocation+request;
Need【i】=need【i】-request【i】
对新状态进行安全性检查,若是安全的,则交易完成。否则进程必须等待request[i]恢复到原来资源分配状态。
死锁检测:
单实例:资源分配图的一个变种——等待图,有环
多实例:找出未死锁进程,类似银行家算法
Allocation:
Available:
Request:
l 设work和finish分别为长度m和n的向量。Work=available。且对于i=0,1,2……finish【i】=false。
l 查找这样的i使满足finish【i】=false;request【i】<=work;如果没有这样的【i】,转至第四步,否则转至第三步。
l Work=work+allocation【i】;finish【i】=true;
l 对某个i,finish【i】=false,则系统处于死锁状态,而且进程pi死锁。
如果死锁经常发生,则应该使用死锁检测算法。
死锁恢复:
进程终止:
中止所有死锁进程;一次只终止一个进程直到取消死锁循环为止
资源抢占:
选择一个牺牲品;回滚;饥饿。
课堂练习:
死锁预防与死锁避免的区别:
预防是让四个必要条件之一不成立
避免是动态检测资源分配状态以确定循环等待条件不可能成立
预防占有且等待条件的协议
一种是每个进程在执行前申请并获得所有资源,另一种是允许进程在没有资源时才可以申请资源
不安全状态不一定会死锁,安全状态一定不会死锁。