2.4.3 避免死锁
操作系统的状态可以分为安全状态以及不安全状态,让操作系统始终保持一个安全状态就能避免死锁。所谓安全状态,是指系统能按某种进程顺序(P1,P2,…,Pn)(称〈P1,P2,…,Pn〉序列为安全序列),来为每个进程 Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。如果系统无法找到这样一个安全序列,则称系统处于不安全状态。当然安全序列可以有多个。
找到安全序列的算法一般是银行家算法,银行家算法最开始是为了合理分配银行的资金保证不会发生资金不足的问题。银行家算法的核心思想是在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。在外面介绍完一些概念之后会根据一个例子来学习一下银行家算法。
假设系统中有 n 个进程,m 种资源:
银行家算法的数据结构: (1)可利用资源向量 Available。这是一个含有 m 个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。
(2)最大需求矩阵 Max。这是一个 n×m 的矩阵,它定义了系统中 n 个进程中的每一个进程对 m 类资源的最大需求。
(3)分配矩阵 Allocation。这也是一个 n×m 的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。
(4)需求矩阵 Need。这也是一个 n×m 的矩阵,用以表示每一个进程尚需的各类资源数。
其中Need=Max-Allocation
银行家算法的步骤:用一个长度为m的一维数组 Requesti 表示本次申请的各种资源量。
①如果 Requesti[j]≤Need[i, j] (0≤j≤m)便转向②;否则认为出错。(因为它所需要的资源数已超过它所宣布的最大值。)
②如果 Requesti[j]≤Available[j] (0≤j≤m),便转向③ ;否则表示尚无足够资源,Pi必须等待。
③系统试探着把资源分配给进程Pi,并修改相应的数据(并非真的分配,修改数值只是为了做预判):
Available = Available - Requesti;
Allocation[i, j] = Allocation[i, j] + Requesti[j];
Need[i, j] = Need[i, j] – Requesti[j]
④操作系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式分配;否则恢复相应数据,让进程阻塞待。
安全性算法步骤:
(1) 设置两个向量:
① 工作向量 Work,它表示系统可提供给进程继续运行所需的各类资源数目,它含有 m个元素,在执行安全算法开始Work:=Available。
② Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做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 都满足,则表示系统处于安全状态;否则,系统处于不安全状态。
举例子:(我从王道书上扒下来的)
其实不管我咋说,大家还是在自己算一遍来的清楚。