python模擬銀行家算法


前言:

大二第一學期學習了操作系統,期末實驗課題要求模擬算法。遂根據自己學習的python寫下此文。以此鍛煉自己編碼能力。雖說是重復造輪子,但還是自己的思路體現

代碼及注釋如下(銀行家算法不再贅述):

 1 #-*- coding: UTF-8 -*-
 2 #@author:若鳥
 3 #@version: 2.0   .
 4 #@date : 2016-12-18
 5 #function:命令行界面實現對各進程請求通過銀行家算法實現分配資源
 6 import numpy as np                                                                      #導入numpy模塊
 7 
 8 #初始化各數據結構
 9 Available = np.array([3,3,2])                                             #可利用各資源總數
10 Max = np.array([[7,5,3],[3,2,2],[9,0,2],[2,2,2],[4,3,3]])                 #各進程最大需求資源數
11 Allocation = np.array([[0,1,0],[2,0,0],[3,0,2],[2,1,1],[0,0,2]])          #已分配各進程的資源數
12 Need = np.array([[7,4,3],[1,2,2],[6,0,0],[0,1,1],[4,3,1]])                #各進程尚需的資源數
13 safeList=[]                                                               #安全進程執行序列
14 Request=[]                                                                #各進程對各資源的請求
15 Request_name=""                                                           #進程名稱
16 
17 
18 def input_Request():
19     global Allocation,Available,Max,Need,safeList,Request,Request_name
20     try:
21         Request_name=input("請輸入請求線程的編號:\n0   1    2    3    4\n")
22         Request_name=int(Request_name)
23         Request_new=input("請輸入P{}的請求資源數(如:* * *) :\n".format(Request_name))
24         Request_new=list(Request_new)
25 
26         for x in range(0,5,2):                                                          #去除輸入的空格
27             i=int(Request_new[x])
28             Request.append(i)
29 
30         Request=np.array(Request)
31     except:
32         print("輸入錯誤,請重新輸入")
33         input_Request()
34 
35 
36 
37 def BankerAlgorithm():
38     global Allocation,Available,Max,Need,safeList,Request,Request_name
39     input_Request()
40 
41     if ((Request<=Need[Request_name]).all()):
42         if ((Request<=Available).all()):
43             Available -=Request                                                          #可利用資源減少
44 
45             Need[Request_name] -= Request                                                #尚需的資源數減少
46             Allocation[Request_name] +=Request                                           #已分配資源增加
47             safeAlgorithm()                                                              #執行安全算法
48         else:
49             print("請求超出可利用的資源,請等待")
50     else:
51         print("線程請求超出所需總資源數")
52 
53 def safeAlgorithm():
54     work = Available                                                                      #分配work向量
55     Finish=[False]*5                                                                    #分配Finish向量
56 
57 
58     while False in Finish:
59         for i in range(0,5):
60            for j in range(0,3):
61                 if ((Finish[i]==False) and ((Need[i]<=work).all())):
62                     for m in range(3):
63                         work[m] =work[m]+ Allocation[i][m]
64                     Finish[i]=True
65                     safeList.append(i)
66                 else:
67                     break
68 
69     if False in Finish:
70         print("*"*45)
71         print("您輸入的請求資源數:{}".format(Request))
72         print("您輸入的請求進程是{}".format(Request_name))
73         print("系統安全性:不安全狀態")
74         print("*"*45)
75     else:
76         print("*"*45)
77         print("您輸入的請求進程是{}".format(Request_name))
78         print("您輸入的請求資源數:{}".format(Request))
79         print("系統安全性:系統安全")
80         print("安全序列為:",safeList)
81         print("*"*45)
82 
83 
84 
85 if __name__ =="__main__":
86 
87     BankerAlgorithm()

 


免責聲明!

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



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