編制模擬銀行家算法的程序,並以下面給出的例子驗證所編寫的程序的正確性。
進程 |
已占資源 |
最大需求數 |
資源種類 |
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