Scarlet Serenade

Operating System | Bankers' Algorithm

银行家算法的核心思想是检查安全状态,假设某个进程 p 请求了某些资源,计算分配之后是否依然是安全状态,如果依然是,就允许分配,不然拒绝。

MAX is a n * m matrix, MAX_Matrix[i, j] 表示进程 i 总共需要多少资源 j 
Allocated is a n * m matrix, Allocated[i, j] 表示已经分配给了进程 i 多少资源 j
Resources is a vector of length m, Resources[i] 表示系统中还有有多少资源 i

通过这些数据可以计算出 NEED = MAX - Allocated

NEED is a n * m matrix, NEED[i, j] 表示进程 i 还需要多少资源 j

如果当前的进程们能以某种顺序完成而不发生死锁,那么这个状态就是安全的。

从第一个未完成的进程开始到最后一个,重复:如果剩下的资源能满足满足当前的进程,那么则标记该进程为已完成,then free all the resources allocated to it.

如果本轮循环后,所有进程都完成了,那么可以断定这是安全状态。 如果只有部分进程被满足了,则进行下一轮循环。 如果本轮循环中没有任何一个进程能被满足,那么该状态不安全。

let found = true
while found && unfinished 
    found = false
    for proc in unfinished 
        if avalable > need[proc] 
            found = true
            delete proc from unfinished
        
if unfinished == 0 
    return safe
else 
    return unsafe
    
<!-- 稍加修改此代码我们也能得出一个安全序列 -->