【操作系统】第七章 死锁

来源:互联网 发布:ui和美工哪个工资高 编辑:程序博客网 时间:2024/06/06 07:42

死锁:某个进程申请资源,如果这时资源不可用,那么该进程进入等待状态。如果所申请的资源被其他等待进程占有,那么该等待进程有可能再也无法改变其状态。

7.1 系统模型
1)进程使用资源顺序:申请(wait())、使用(CS)、释放(signal());

7.2 死锁特征
1)死锁的必要条件:
a)互斥(至少有一个资源处于非共享模式);
b)占有并等待(一个进程必须占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有);
c)非抢占(资源不能被抢占);
d)循环等待(等待进程{P0,P1,…,Pn},P0等待资源为P1占有,P1等待资源为P2占有,循环下去);
当这四个条件同时满足就会引起死锁。
2)资源分配图:如果分配图没有环,那么系统就没有进程死锁,如果资源分配图有环,那么可能存在死锁(如果每个资源都只有一个实例则必定死锁,环是死锁存在的充分必要条件;如果环上有些资源不止一个实例可能出现死锁,环是死锁存在的必要条件而不是充分条件),如下图(操作系统书第213面)
这里写图片描述

7.3 死锁处理方法
1)可使用协议以预防或避免死锁,确保系统不会进入死锁状态;
2)可允许系统进入死锁状态,然后检测它,并加以恢复;
3)可忽视这个问题,认为死锁不可能在系统内发生(为大多数操作系统所用,包括UNIX和Windows)。

7.4 死锁预防
思路:确保死锁发生的四个必要条件中的一个必要条件不成立,就能预防死锁发生。
副作用:低设备使用率和系统吞吐率。
1) 互斥:通过共享资源不要求互斥访问,但通常不能这样做,因为有的资源本身就是非共享的;
2) 占有并等待:必须保证一个进程申请一个资源时它不能占有其他资源;
a) 解决:可以让进程在执行前一次性申请并获得所有资源,也可以让进程在没有资源时才可以申请资源;
b) 缺点:资源利用率比较低(可能申请的资源过早而导致很长一段时间不用资源);饥饿(可能永久等待资源);
3) 非抢占:
a) 解决:如果一个进程占有资源并申请另一个不能立即分配的资源,那么其现有的资源都可被抢占;
b) 适用:状态可以保存和恢复的资源,如CPU寄存器和内存;
4) 循环等待:
a) 解决:给资源类型排序,每个进程只按递增顺序申请资源;

7.5 死锁避免
死锁避免算法:动态地检测资源分配状态以确保循环等待条件不可能成立。
1) 安全状态:如果系统能按某个顺序为每个进程分配资源(不超过其最大值)并能避免死锁,那么系统状态是安全的,更准确地说,如果存在一个安全序列,那么系统处于安全状态;
2) 安全状态不是死锁状态,死锁状态是不安全状态,不安全状态不一定是死锁状态;
3) 资源分配图算法(每种资源类型只有一个实例)(操作系统书第221面):
这里写图片描述
4) 银行家算法(每种资源类型可以有多个实例):
a) 数据结构(n为系统进程的个数,m为资源类型的种类):
i. Available:长度为m的向量,表示每种资源的现有实例数量;
ii. Max:n*m矩阵,表示进程i对资源j的需求数量;
iii. Allocation:n*m矩阵,表示进程i当前拥有资源j的数量;
iv. Need:n*m矩阵,表示进程i还需要资源j的数量;
v. Requesti[j]:长度为m的向量的其中一个值,表示进程Pi需要资源j的数量;
b) 安全性算法:
i. 初始化:Work=Avaliable,Finish[i]=false(i=0,1,…,n-1);
ii. 查找:Finish[i]=false && Needi<=Work,如果没有符合条件的i跳到最后一步;
iii. Work=Work+Allocation,,Finish[i]=true,回到第二步;
iv. 如果所有Finish[i]=true,那么系统处于安全状态;
c) 资源请求算法:
i. 如果Requesti<=Needi,那么跳到第二步,否则出错(进程Pi已超过了其最大请求);
ii. 如果Requesti<=Available,那么跳到第三步,否则,Pi必须等待(因为没有可用资源);
iii. 分配:Available = Available – Requesti; Allocationi = Allocationi + Requesti; Needi = Needi – Requesti;
如果产生的资源分配状态是安全的,那么交易完成且进程Pi可分配到其所需要的资源,如果产生的资源分配状态是不安全的,那么进程Pi必须等待Requesti并恢复到原来资源分配状态;
5) 实例:手动模拟书上例子可以加深印象;

7.6 死锁检测
额外开销:维护所需要信息和执行检测算法的运行开销,死锁恢复所引起的损失。
1) 等待图算法(每种资源类型可以有多个实例):
a) 判定:当等待图中有一个环时,系统存在死锁(操作系统书第224面);
这里写图片描述
2) (每种资源类型可以有多个实例):
a) 数据结构(n为系统进程的个数,m为资源类型的种类):
i. Available:长度为m的向量,表示每种资源的现有实例数量;
ii. Allocation:n*m矩阵,表示进程i当前拥有资源j的数量;
iii. Requesti[j]:长度为m的向量的其中一个值,表示进程Pi需要资源j的数量;
b) 算法:
i. 初始化:Work=Avaliable,如果Allocationi不为0,则Finish[i]=false,否则Finish[i]=true(当前不占有资源,不会处于死锁状态里面,可以忽略这些进程);
ii. 查找Finish[i]=false && Requesti<=Work,如果没有这样的i,转到第四步;
iii. Work=Work+Allocationi,Finish[i]=true,转到第二步;
iv. 如果有i存在Finish[i]==false,系统处于死锁状态,且表明进程Pi死锁。

7.7 死锁恢复
1) 进程终止:
a) 终止所有死锁进程:代价大,计算结果需要放弃,可能需要重新计算很多;
b) 一次只终止一个进程直到取消死锁循环为止:开销相当大,每一次终止一个进程都需要调用死锁检测算法;
2) 资源抢占:逐步从进程中抢占资源给其他进程使用,知道死锁环被打破为止,需要处理:
a) 选择一个牺牲品;
b) 回滚(从一个进程抢占了资源需要对该进程进行回滚);
c) 饥饿(一个进程可能总被选择作牺牲);

原创粉丝点击