一、什么是安全序列
所谓的安全序列,就是指系统如果按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就处于安全状态。当然,安全序列可以有多个。
二、安全序列、不安全状态、死锁的联系
如果分配资源后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有的进程都无法顺利执行下去。
当然,如果有进程提前归还了一些资源,那么系统也有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况。
如果系统处于安全状态,就一定不会发生死锁。
如果系统进入不安全状态,就可能发生死锁(处于不安全状态未必发生死锁,但发生死锁一定是不安全状态)
因此,在资源分配之前先判断这次分配是否会导致系统进入不安全状态,以此来决定是否答应资源分配请求。这也就是银行家算法的核心。
三、避免死锁——银行家算法
数据结构:
长度为m的一位数组Available表示系统还有多少可用资源
n*m的矩阵Max表示各个进程对资源的最大需求数
n*m的矩阵Allocation表示对所有进程的资源分配情况
Max-Allocation=Need矩阵表示各个进程最多还需要多少资源
用长度为m的一位数组Request表示进程此次申请的各种资源数
银行家算法的步骤:
1)检查此次申请是否超过之前声明的最大需求数
2)检查此时系统剩余可用资源是否还能满足此次请求
3)试探分配,更各个改数据结构
4)用安全型算法检查此次分配是否会导致系统进入不安全状态
安全性算法的步骤:
1)检查当前剩余可用资源是否能满足某个资源的最大需求,如果可以,就将该进程加入安全序列
2)等到这个进程执行完毕就将它占有的全部资源回收
3)不断重复上述过程,看看最终是否能让所有进程都加入安全序列
系统处于不安全状态未必死锁,但是死锁一定处于不安全状态。
系统处于安全状态一定不会死锁。