用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM