作業系統銀行家演算法排程實驗
[目的要求]
銀行家演算法是由Dijkstra設計的最具有代表性的避免死鎖的演算法。本實驗要求用高階語言編寫一個銀行家的模擬演算法。
通過本實驗可以對預防死鎖和銀行家演算法有更深刻的認識。
[試驗內容]
1、 設定資料結構
包括可利用資源向量(Availiable),最大需求矩陣(Max),分配矩陣(Allocation),需求矩陣(Need)
2、 設計安全性演算法
設定工作向量Work表示系統可提供程序繼續執行可利用資源數目,Finish表示系統是否有足夠的資源分配給程序
[銀行家演算法]
一.構建銀行家演算法中的資料結構
根據課本P101圖3-16中的程序和資源情況,構建Available,Max,Allocation,Need矩陣。
二.銀行家演算法
0.執行安全性演算法,檢查系統是否處於安全狀態。
1.輸入程序i的請求向量request
2.如果request[i]<=Need[i],執行步驟三,否則結束,並報錯
3.系統嘗試把資源分配給程序Pi,修改以下資源的值:
available[j]=available[j]-request[j]
Allocation[i][j]=Allocation[i][j]+request[j]
need[i][j]=need[i][j]-request[j]
4.執行安全性演算法,若安全,完成分配,若不安全,還原資源:
available[j]=available[j]+request[j]
Allocation[i][j]=Allocation[i][j]-request[j]
need[i][j]=need[i][j]+request[j]
三.安全性演算法
1.設定工作向量work,使其等於Available,設定finish向量,使其所有值都為false
2.從程序集合中找到滿足下列條件的程序:
Finish[i]值為false
Need[i,j]<=work[j]
若找到,執行步驟3,否則執行步驟4
3.程序獲取資源順利執行,釋放資源:
Work[j]=work[j]+allocation[j]
Finish[i]=true
執行步驟2
4.如果所有的程序的finish都為true,則安全,否則不安全。
四.編碼
available=[3,3,2]
Max=[[7,5,3],[3,2,2],[9,0,2],[2,2,2],[4,3,3]]
Allocation=[[0,1,0],[2,0,0],[3,0,2],[2,1,1],[0,0,2]]
need=[]
f=[]
for i in range(5):
for j in range(3):
f+=[Max[i][j]-Allocation[i][j]]
need.append(f)
f=[]
def bank():
if safe()==1:
print('此時系統安全,正在嘗試分配')
i=input('請輸入程序序號')
i=int(i)
print('請輸入請求向量')
request=[]
for j in range(3):
a=input()
request.append(int(a))
print(request)
for j in range(3):
if request[j]>need[i][j]:
print('分配出錯')
return 0
for j in range(3):
if request[j]>available[j]:
print("資源不夠,還需等待")
return 0
for j in range(3):
available[j]=available[j]-request[j]
Allocation[i][j]=Allocation[i][j]+request[j]
need[i][j]=need[i][j]-request[j]
if safe()==1:
print('完成此次分配')
else:
print('分配不安全,禁止分配')
for j in range(3):
available[j]=available[j]+request[j]
Allocation[i][j]=Allocation[i][j]-request[j]
need[i][j]=need[i][j]+request[j]
def safe():
work=[]
work=work+available
finish=[0,0,0,0,0]
while(True):
for i in range(5):
c=0
if finish[i]==0:
for j in range(3):
if need[i][j]<=work[j]:
c=c+1
if c==3:
ii=i
break;
if c==3:
for j in range(3):
work[j]=work[j]+Allocation[ii][j]
finish[ii]=1
else:
if sum(finish)==5:
return 1
else:
return 0
while(1):
z=input('是否結束分配,是請按1,否請按0:')
if z=='1':
break
bank()