1. 程式人生 > >作業系統銀行家演算法排程實驗

作業系統銀行家演算法排程實驗

[目的要求]

銀行家演算法是由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()