2.4_3 死锁的处理策略——避免死锁
知识总览
什么是安全序列
所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。
什么是系统的不安全状态
如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况。
与死锁有何联系
如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)
因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是“银行家算法”的核心思想。
银行家算法
银行家算法是荷兰学者Dijkstra为银行系统设计的,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。后来该算法被用在操作系统中,用于避免死锁。
核心思想:在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。
进程 | 最大需求 | 已分配 | 最多还需要 |
---|---|---|---|
P0 | (7,5,3) | (2,2,1) | (5,3,2) |
P1 | (3,2,2) | (2,0,0) | (1,2,2) |
P2 | (9,0,2) | (3,0,2) | (6,0,0) |
P3 | (2,2,2) | (2,1,1) | (0,1,1) |
P4 | (4,3,3) | (0,0,2) | (4,3,1) |
假设系统中有n个进程,m种资源
每个进程在运行前先声明对各种资源的最大需求数,则可用一个n * m的矩阵(可用二维数组实现)表示所有进程对各种资源的最大需求数。不妨称为最大需求矩阵Max,Max[i,j]=K表示进程Pi最多需要K个资源Rj。同理,系统可以用一个n * m的分配矩阵 Allocation表示对所有进程的资源分配情况。Max-Allocation=Need矩阵,表示各进程最多还需要多少各类资源。
另外,还要用一个长度为m的一维数组 Available表示当前系统中还有多少可用资源。
某进程Pi向系统申请资源,可用一个长度为m的一维数组 Request;表示本次申请的各种资源量。
可用银行家算法预判本次分配是否会导致系统进入不安全状态:
- 如果Requesti[j]≤Need[i,j] (0≤j≤m)便转向2;否则认为出错。
- 如果 Requesti[j]≤Available[j] (0≤j≤m),便转向3;否则表示尚无足够资源,Pi必须等待。
- 系统试探着把资源分配给进程Pi,并修改相应的数据**(并非真的分配,修改数值只是为了做预判)**:
- 操作系統执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式分配;否则,恢复相
应数据,让进程阻塞等待。
Available = Available - Request;
Allocation[i, j] = Allocation[i, j] + Requesti[j];
Need[i, j] = Need[i, j] - Request,[j]
知识回顾与重要考点
数据结构:
长度为m的一维数组Available表示还有多少可用资源
n * m矩阵 Max 表示各进程对资源的最大需求数
n * m矩阵 Allocation 表示已经给各进程分配了多少资源
Max-Allocation=Need 矩阵表示各进程最多还需要多少资源
用长度为 m 的一位数组 Request 表示进程此次申请的各种资源数
银行家算法步骤:
- 检查此次申请是否超过了之前声明的最大需求数
- 检查此时系统剩余的可用资源是否还能满足这次请求
- 试探着分配,更改各数据结构
- 用安全性算法检查此次分配是否会导致系统进入不安全状态
安全性算法步骤:
检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收。
不断重复上述过程,看最终是否能让所有进程都加入安全序列。