银行家算法
银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。
流程图如下:
例如:判断如下请求状态是否安全
Process(进程号) | Allocation(已分配) | Need(需要) | Avaiable(可分配资源) |
p0 | 0 0 3 2 | 0 0 1 2 | 1 6 2 2 |
p1 | 1 0 0 0 | 1 7 5 0 | |
p2 | 1 3 5 4 | 2 3 5 6 | |
p3 | 0 3 3 2 | 0 6 5 2 | |
p4 | 0 0 1 4 | 0 6 5 6 |
判断步骤:
1、当前可分配资源为1 6 2 2,那么我们从Need中查找所需要资源小于1 6 2 2的,可以查找到p0进程,目前需要 0 0 1 2,那么我们先把资源分配给p0,
p0执行完成后会释放它已分配的资源 0 0 3 2,那么p0执行完成后Avaiable = 1 6 2 2 + 0 0 3 2 = 1 6 5 4
2、同理,我们继续从剩下尚未执行的进程的Need中查找所需资源小于1 6 5 4的,可以查找到P3进程,目前需要 0 6 5 2,那么我们资源分配给p3执行完成
后 Avaiable = 1 6 5 4 + 0 3 3 2 = 1 9 8 6
3、同理继续判断,判断完成后,我们可以找到一条安全序列:p0->p3->p1->p4->p2,所以请求是安全的。
步骤如下表:
进程号 | Work | Need | Allocation | Work+Allaction | Finish |
p0 | 1 6 2 2 | 0 0 1 2 | 0 0 3 2 | 1 6 5 4 | true |
p3 | 1 6 5 4 | 0 6 5 2 | 0 3 3 2 | 1 9 8 6 | true |
p1 | 1 9 8 6 | 1 7 5 0 | 1 0 0 0 | 2 9 8 6 | true |
p4 | 2 9 8 6 | 0 6 5 6 | 0 0 1 4 | 2 9 9 10 | true |
p2 | 2 9 9 10 | 2 3 5 6 | 1 3 5 4 | 3 12 14 14 | true |
那么如果p2提出Request(1,2,2,2),能否分配成功?
根据上面的流程图,我们需要:
1、判断Request 是否小于等于 Need, 如果否,则失败;如果小于继续;1 2 2 2 < 2 3 5 6 = true
2、判断Request 是否小于等于Avaiable,如果否,则等待; 1 2 2 2 < 1 6 2 2 = true
3、尝试分配:
Avaiable = Avaiable - Request = 1 6 2 2 - 1 2 2 2 = 0 4 0 0
Allocation = Allocation + Request = 1 3 5 4 + 1 2 2 2 = 2 5 7 6
Need = Need - Request = 2 3 5 6 - 1 2 2 2 = 1 1 3 4
4、判断是否安全
Process(进程号) | Allocation(已分配) | Need(需要) | Avaiable(可分配资源) |
p0 | 0 0 3 2 | 0 0 1 2 | 0 4 0 0 |
p1 | 1 0 0 0 | 1 7 5 0 | |
p2 | 2 5 7 6 | 1 1 3 4 | |
p3 | 0 3 3 2 | 0 6 5 2 | |
p4 | 0 0 1 4 | 0 6 5 6 |
我们按照上面的判断步骤,去Need中寻找所需资源小于 0 4 0 0 的进程,结果并没有找到,所以当前是不安全的,p2提出Request(1,2,2,2)不能分配成功。