前言:
大二第一學期學習了操作系統,期末實驗課題要求模擬算法。遂根據自己學習的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()