操作系统学习笔记(六)

来源:互联网 发布:nginx反向代理参数说明 编辑:程序博客网 时间:2024/06/06 02:12
处理机死锁(Deadlock)

3.5 产生死锁的原因和必要条件

3.51 产生死锁的原因

(1)竞争资源。
当系统中供多个进程的资源数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁。
   1 系统中资源可分为两类,一是可剥夺资源,即某进程在获得这类资源后,该资源偶又可以被其他资源或系统剥夺。
二是不可剥夺资源,系统分配给某进程后,再不能强行回收,只能等他用完自行释放。
2 竞争非剥夺资源
3 竞争临时性资源:临时资源指:由一个进程产生被另一个进程使用一短暂时间后便无用的资源,也被成为消耗性资源。
(2)进程间推进顺序不当引起死锁。

3.52 产生死锁的必要条件

死锁发生的四个必要条件:

(1)互斥条件:同一段时间内某资源只能被互斥使用。

(2)请求和保持条件:进程已经保持了至少一种资源,但又提出了新的资源请求,而该资源又已经被其他进程占用,此时请求进程阻塞,但又对自己已经获得的其他资源保持不放。

(3)不剥夺条件:进程已获得资源,在未使用完之前,不能被剥夺,只能在完成后自己释放。

(4)环路等待条件:发生死锁时,必然存在一个进程--资源的环形链。

3.53 处理死锁的基本方法

预防死锁、避免死锁、检测死锁、解除死锁。

3.6 预防死锁的方法

3.61 预防死锁的方法

预防死锁的方法即使四个必要条件中的2,3,4条件之一不能实现。条件一是设备各有特性所决定,不能改变反而要加紧保证。

(1)摒弃“请求和保持”条件

使进程一下次获得了所有所需资源才允许它运行。缺点是恶化了资源的利用率,延迟了进程的运行

(2)摒弃“不剥夺”条件

对某一进程已经占有的资源,如果发生申请新资源阻塞,则在运行过程中会被暂时的释放。

(3)摒弃“环路等待”条件

系统将所有资源按类型进行线性排队,并赋予不同的序号。所有进程会按照资源序号递增的次序提出。

3.62 系统安全状态

 把系统的状态分为安全状态和不安全状态,只要系统始终处于安全状态便可以避免死锁。
 安全状态:系统能按某种进程的顺序(P1,P2,P3,P4...)称<P1,P2,P3,P4>序列为安全序列,来为每个进程Pi分配所需资源,是每个进程可以顺利完成。如果系统无法找到这样一个安全序列,则系统处于不安全状态

 例子:


 表格表示当前进程的资源分配状态,现在只剩下3个单位的资源,如何满足进程的需要?经分析发现,存在一个安全序列<P2,P1,P3>.即先给P2分配两个资源
 待其完成后释放四个资源,于是现在剩下5个资源,将其全部给P1,待P1完成后释放全部资源,这样就可以供P3使用。因此处于安全状态。
 此时若不按照该安全序列分配,则系统将会从安全序列转为不安全序列。

3.63 利用银行家算法避免死锁

 1 银行家算法中的数据结构

(1)可利用的资源向量Available。这是一个含有m个元素的数组,每一个元素代表一类可利用的资源数目。初始值为系统中所配置的该类全部可用资源的数目,其数值
随该类资源的分配和回收而动态地改变。如果Available[j] = K,则表示系统中现有Rj类资源K个。
(2)最大需求矩阵Max。这是一个n*m的矩阵,定义了系统中n个进程每一个进程对m类资源的最大需求。如果Max[i,j] = K,则表示进程i需要Rj类资源的最大数目为K。
(3)分配矩阵Allocation。这也是一个n*m的矩阵它定义了系统中每一类资源当前分配给每一进程的资源数。如果Allocation[i,j] = K,则表示进程i当前已分配Rj类
资源的数目为K。
(4)需求矩阵Need。这是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j] = K,则表示进程i还需要Rj类资源K个,方能完成任务。
以上三个矩阵的关系:
Need[i,j] = Max[i,j] - Allocation[i,j];
即尚需的等于总需求减去已经分配的。

 2 银行家算法

 设Requesti是进程Pi的请求需求量,如果Requesti[j] = K,表示进程Pi需要K个Rj型资源。当Pi发出请求后,系统按下述步骤进行检查:
 (1)如果Requesti[j]<=Need[i,j],便转向步骤(2),否则认为出错。
 (2)如果Requesti[j]<=Available[j],便转向步骤(3),否则表示尚无足够资源,Pi必须等待
 (3)系统试探着把资源分配给进程Pi,并修改下面的数据结构中的数值:
Available[j] := Available[j] - Requesti[j];
Allocation[i,j] := Allocation[i,j] + Requesti[j];
Need[i,j] := Need[i,j] - Requesti[j];
 (4)系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全则正式将资源分配给进程Pi,完成本次分配;否则将本次分配作废,回复原来的资源分配
 状态,让进程Pi等待。
 

 3 安全性算法

 系统执行安全性算法可描述如下:
 (1)设置两个向量:
    工作向量 Work,表示系统可提供给进程继续运行所需的各类资源的数目,它含有m个元素,在执行安全算法开始时,Work := Available。
Finsh:他表示系统是否有足够的资源分配给进程,使之运行完成。开始时Finish[i] := false,当有足够资源分配的时候,Finish[i] := true。
 
 (2)从进程集合中找到一个满足下述条件的进程:
Finish[i] = false;
Need[i,j] <= Work[j],若找到,则执行步骤(3),否则执行步骤(4)
 (3)当进程Pi获得资源后,可顺利执行,直到完成,并释放出分配给他的资源,故应执行:
Work[j] := Work[j] + Allocation[i,j];
Finish[i] := true;
go to step 2;
 (4)如果所有进程的Finish[i] := true都满足则表示系统处于安全状态,否则系统处于不安全状态。

3.7 死锁的检测与解除

3.71 死锁的检测

死锁定理:S为死锁的充分条件是,当且仅当S状态的资源分配图是不可完全简化的。该充分条件被称为死锁定理。

3.72 死锁的解除

(1)剥夺资源:从其他进程剥夺足够数量的资源给死锁进程,以解除死锁状态。
(2)撤销进程:
1 使全部死锁进程都夭折
2 按照某种顺序这个的撤销进程,直到有足够资源可用。
撤销进程要做到付出代价最小。
0 0
原创粉丝点击