银行家算法具体实现

安全序列和安全状态:

所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况。

如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。

 

银行家算法介绍

        银行家算法是荷兰学者Djkstra为银行系统设计的,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。后来该算法被用在操作系统中,用于避免死锁。核心思想:在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。

 实现思路:

        建立一些相应的数据结构用来记录系统中某个时间点的资源使用及需求情况。当有资源请求时,先进行假定分配,假定资源分配后,相应的数据结构进行了修改,发现所有进程均能在有限时间内获得其所需的所有资源,此时系统处于安全状态,则进行允许资源分配。否则,系统处于不安全状态,则拒绝资源分配。

相关数据结构主要为:

1、系统的资源总向量:记录系统中所有资源信息

2、剩余资源向量:记录当前可用资源数

3、进程占用资源情况矩阵:进程在其生命周期内的占用资源情况

例:系统中有A:3、B:4、C:3 三类资源,系统的资源总向量为(3,4,3),此时有三个进程P1,P2,P3

三个进程占用资源情况、总需求资源情况、请求资源情况为:

 则计算出剩余资源向量:资源总向量-资源占用向量=(1,1,1)(资源占用向量=(2,3,2)),所有进程所需都能被满足,且资源还有充足,说明此分配方案为一个安全序列,系统根据次方案进行分配后处于安全状态,故可以根据请求来分配资源。

银行家算法步骤:
①检查此次申请是否超过了之前声明的最大需求数
②检查此时系统剩余的可用资源是否还能满足这次请求
③试探着分配,更改各数据结构0用安全性算法检查此次分配是否会导致系统进入不安全状态

安全性算法步骤:检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收。不断重复上述过程,看最终是否能让所有进程都加入安全序列。


版权声明:本文为m0_62808395原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。