银行家算法是操作系统中死锁避免著名的算法,利用该算法可以动态的给进程分配资源,并保证系统的安全运行。
什么是死锁
操作系统中,两个或两个以上的进程无限期的等待永远不会发生的条件的系统状态。结果是导致每个进程都无限期阻塞。
另一种说法是,有两个或以上的线程持有独占性资源,并且申请其他进程占有的资源,此时每个进程都有一部分资源,但又不够,从而每个进程都无法向前推进,陷入阻塞状态。
什么是死锁避免
不提前破坏死锁产生的条件,而是在进程运行过程中申请资源时,判断该资源分配后是否可能导致,死锁。若是,则拒绝分别等待。不会产生死锁则分配。
银行家算法
银行家算法借用了银行贷款的策略,贷款人申请的数额不能超过银行可提供的数额,顾客得到贷款金额后,一定要在有限的时间内归还贷款,以供整个系统正常运行。
初始化数据结构:资源向量矩阵AVAILABLE,最大需求矩阵MAX,分配矩阵ALLOCATION,需求矩阵NEED.
其中AVAILABLE[i]的值表示第i个资源可分配的数量。MAX[i][j]表示第i个进程所需第j个资源的最大数量。ALLOCATION[i][j]表示第i个进程以从操作系统分配的第J个资源的数量。NEED[i][j]表示目前第i个进程请求操作系统分配第J个资源的数量。
银行家算法的基本思想是分配给某个进程资源后,系统是安全状态,才分配资源。否则,拒绝分配。
算法流程:
设进程thread提出请求REQUEST[i].
(1)如果REQUEST[thread][i] <= NEED[thread][i],转(2);否则出错。
(2)如果REQUEST[thread][i] <= AVAILABLE[i],转(3),否则出错。
(3)系统试探分配资源,修改相关数据。
AVAILABLE[i]-= REQUEST[thread][i]
ALLOCATION[thread][i]+= REQUEST[thread][i]
NEED[thread][i]-= REQUEST[thread][i]
(4)执行安全性检查,如果安全,则分配,否则系统恢复原状,进程等待。
安全性检查
给每个进程都设置一个标准FINISH,FINISH的值为false表示进程没执行完,值为true,表示该进程已经执行完毕。
(1)在进程列表中找满足如下条件的进程
FINISH = false
AVAILABLE <= NEED
如果找到,执行(2),否则执行(3)
(2)假设进程获得需要的资源,可顺利执行,直到完成并释放资源。
AVAILABLE+=ALLOCATION
FINISH = true;
Goto(1)
(3)如果所有的进程FINISH=true,则安全,否则系统不安全。