Fork me on GitHub

用python实现银行家算法

编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。

进程

已占资源

最大需求数

资源种类

A B C D

A B C D

P0

0 0 1 2

0 0 1 2

P1

1 0 0 0

1 7 5 0

P2

1 3 5 4

2 3 5 6

P3

0 6 3 2

0 6 5 2

P4

0 0 1 4

0 6 5 6

现在系统中A、B、C、D 4类资源分别还剩1、5、2、0个,请按银行家算法回答: 
1、 现在系统是否处于安全状态? 
2、 如果现在进程P1提出需要(0、4、2、0)个资源的请求,系统能否满足它的请求?

 1 #coding: utf-8
 2 #已经拥有的资源个数
 3 have = [[0,0,1,2],[1,0,0,0],[1,3,5,4],[0,6,3,2],[0,0,1,4]]
 4 #需要的资源个数
 5 need = [[0,0,1,2],[1,7,5,0],[2,3,5,6],[0,6,5,2],[0,6,5,6]]
 6 #系统拥有的资源个数
 7 resource = [1,5,2,0]
 8 #请求的资源个数
 9 request = [0,4,2,0]
10 #请求的进程
11 p = 1
12 for i in range(len(resource)):
13     if request[i]<=need[p][i] and request[i]<=resource[i]:#如果请求的资源少于系统拥有的则分配
14         resource[i] -= request[i]
15         need[p][i] -= request[i]
16     else:#否则不分配并结束
17         exit('[-]request more than system have')
18 #安全检查
19 Fina = [False]*5 #5为进程个数 len(have)或len(need) False表示没有分配资源
20 queue = []#用于存储已经分配资源的进程
21 #q用于判断循环条件,如果循环过后的结果与前一次相同则表示没有进程被分配资源循环结束
22 q = queue
23 while True:
24     for i in range(len(have)):
25         flag = True
26         for j in range(len(have[i])):
27             if need[i][j] > resource[j]:
28                 flag = False
29                 break
30         if flag == True:
31             Fina[i] = True#如果满足条件则将False改为True表示给i进程分配了资源
32             queue.append(i)
33             for j in range(len(have[i])):
34                 resource[j] += have[i][j]#将i进程占有的所有资源释放
35     if q == queue:
36         break
37     else:
38         q = queue
39 if False in Fina:
40     print '[-]Don\'t have safe order'
41     print Fina
42 else:
43     print '[+] have safe order'
44     print queue

posted @ 2019-05-17 21:47  bypa55  阅读(1070)  评论(0编辑  收藏