1. 程式人生 > >銀行家演算法的模擬實現

銀行家演算法的模擬實現

一、設計目的

1、瞭解多道程式系統中,多個程序併發執行的資源分配。

2、掌握死鎖的產生的原因、產生死鎖的必要條件和處理死鎖的基本方法。

3、掌握預防死鎖的方法,系統安全狀態的基本概念。

4、掌握銀行家演算法,瞭解資源在程序併發執行中的資源分配策略。

5、理解死鎖避免在當前計算機系統不常使用的原因。

二、設計任務

Window98/2000 系統的TC2.0環境下執行程式;

通過最有代表性的避免死鎖的演算法(Dijkstra)的銀行家演算法程式實現來理解程序併發中的資源分配,死鎖避免在死鎖解決中的可行性;

③ 設計程式在自動、手動方式下執行,理解銀行家演算法的實質。

三、設計內容與步驟

A、銀行家演算法設計的知識準備

1

、死鎖概念。在多道程式系統中,雖可藉助於多個程序的併發執行,來改善系統的資源利用率,提高系統的吞吐量,但可能發生一種危險━━死鎖。所謂死鎖(Deadlock),是指多個程序在執行中因爭奪資源而造成的一種僵局(Deadly_Embrace),當程序處於這種僵持狀態時,若無外力作用,它們都將無法再向前推進。一組程序中,每個程序都無限等待被該組程序中另一程序所佔有的資源,因而永遠無法得到的資源,這種現象稱為程序死鎖,這一組程序就稱為死鎖程序

2、關於死鎖的一些結論:

Ø參與死鎖的程序最少是兩個

Ø(兩個以上程序才會出現死鎖)

Ø參與死鎖的程序至少有兩個已經佔有資源

Ø參與死鎖的所有程序都在等待資源

Ø參與死鎖的程序是當前系統中所有程序的子集

注:如果死鎖發生,會浪費大量系統資源,甚至導致系統崩潰。

3、資源分類。

永久性資源:

可以被多個程序多次使用(可再用資源)

l可搶佔資源

l不可搶佔資源

臨時性資源:只可使用一次的資源;如訊號量,中斷訊號,同步訊號等(可消耗性資源)

      “申請--分配--使用--釋放”模式

4、產生死鎖的四個必要條件:互斥使用(資源獨佔)、不可強佔(不可剝奪)、請求和保持(部分分配,佔有申請)、迴圈等待。

1) 互斥使用(資源獨佔)

一個資源每次只能給一個程序使用

2) 不可強佔(不可剝奪)

資源申請者不能強行的從資源佔有者手中奪取資源,資源只能由佔有者自願釋放

3) 請求和保持(部分分配,佔有申請)

一個程序在申請新的資源的同時保持對原有資源的佔有(只有這樣才是動態申請,動態分配)

4) 迴圈等待

存在一個程序等待佇列

{P1 , P2 , … , Pn},

其中P1等待P2佔有的資源,P2等待P3佔有的資源,Pn等待P1佔有的資源,形成一個程序等待環路

5、死鎖的解決方案

5.1 產生死鎖的例子

申請不同型別資源產生死鎖

P1

申請印表機

申請掃描器

使用

釋放印表機

釋放掃描器

P2

申請掃描器

申請印表機

使用

釋放印表機

釋放掃描器

申請同類資源產生死鎖(如記憶體)

設有資源RRm個分配單位,由n個程序P1,P2,…,Pnn > m)共享。假設每個程序對R的申請和釋放符合下列原則:

* 一次只能申請一個單位

* 滿足總申請後才能使用

* 使用完後一次性釋放

m=2n=3

資源分配不當導致死鎖產生

5.2死鎖預防:

定義:在系統設計時確定資源分配演算法,保證不發生死鎖。具體的做法是破壞產生死鎖的四個必要條件之一

①破壞“不可剝奪”條件

在允許程序動態申請資源前提下規定,一個程序在申請新的資源不能立即得到滿足而變為等待狀態之前,必須釋放已佔有的全部資源,若需要再重新申請

②破壞“請求和保持”條件

要求每個程序在執行前必須一次性申請它所要求的所有資源,且僅當該程序所要資源均可滿足時才給予一次性分配

③破壞“迴圈等待”條件

採用資源有序分配法

把系統中所有資源編號,程序在申請資源時必須嚴格按資源編號的遞增次序進行,否則作業系統不予分配

6.安全狀態與不安全狀態

安全狀態:

如果存在一個由系統中所有程序構成的安全序列P1,…Pn,則系統處於安全狀態。一個程序序列{P1,…,Pn}是安全的,如果對於每一個程序Pi(1≤i≤n),它以後尚需要的資源量不超過系統當前剩餘資源量與所有程序Pj (j < i )當前佔有資源量之和,系統處於安全狀態 (安全狀態一定是沒有死鎖發生的)

不安全狀態:不存在一個安全序列,不安全狀態一定導致死鎖。

B、銀行家演算法

一、銀行家演算法中的資料結構

1.可利用資源向量Available

它是一個含有m個元素的陣列,其中的每一個元素代表一類可利用的資源數目,其初始值是系統中所配置的該類全部可用資源數目。其數值隨該類資源的分配和回收而動態地改變。如果Available[j]=K,則表示系統中現有Rj類資源K個。

2.最大需求短陣Max

這是—個n×m的矩陣,它定義了系統中n個程序中的每一個程序對m類資源的最大需求。如果Max(i,j)=K,表示程序i需要Rj類資源的最大數目為K。

3.分配短陣Allocation

這是一個n×m的矩陣,它定義了系統中每一類資源當前已分配給每個程序的資源數。如果Allocation(i,j)=K,表示程序i當前已分得Rj類資源的數目為K。

4.需求矩陣Need

它是一個n×m的矩陣,用以表示每一個程序尚需的各類資源數,如果Need[i,j]=K,則表示程序i還需要Rj類資源k個,方能完成其任務。

上述三個矩陣間存在下述關係:

Need[i,j]=Max[i,j]-Allocation[i,j]

二、銀行家演算法

設Requesti是程序Pi的請求向量。如果Requesti[j]=k,表示程序只需要k個Rj型別的資源。當Pi發出資源請求後,系統按下述步驟進行檢查:

1)如果 Requesti[j]<=Need[i,j],則轉向步驟2;否則,認為出錯,因為它所需要的資源數已超過它所宣佈的最大值。

2)如果Requesti[j]<=Available[j] ,則轉向步驟3;否則,表示系統中尚無足夠的資源,Pi必須等待。

3)系統試探把要求的資源分配給程序Pi,並修改下面資料結構中的數值:

Available[j]:=Available[j]-Requesti[j];

Allocation[i,j]:=Allocation[i,j]+Requesti[j];

Need[i,j]:=Need[i,j]-Requesti[j];

4)系統執行安全性演算法,檢查此次資源分配後,系統是否處於安全狀態。若安全,才正式將資源分配給程序Pi,以完成本次分配;否則,將試探分配作廢,恢復原來的資源分配狀態,讓程序Pi等待。

三、安全性演算法

系統所執行的安全性演算法可描述如下:

1)設定兩個向量

①、工作向量Work。它表示系統可提供給程序繼續執行所需要的各類資源數目,它含有m個元素,執行安全演算法開始時,Work = Available。

②、Finish。它表示系統是否有足夠的資源分配給程序,使之執行完成,開始時先做Finish[i]:=false ;當有足夠資源分配給程序時,令 Finish[i]:=true。

2)從程序集合中找到一個能滿足下述條件的程序:

①、Finish[i]=false; ②、Need[i,j]<=Work[j];如找到,執行步驟(3);否則,執行步驟(4)。

3)當程序Pi獲得資源後,可順利執行,直至完成,並釋放出分配給它的資源,故應執行:

Work[j]:=Work[i]+Allocation[i,j];

Finish[i]:=true;

goto step 2;

4)如果所有程序的Finish[i]:=true,則表示系統處於安全狀態;否則,系統處於不安全狀態。

四、銀行家演算法之例

假定系統中有五個程序:{P0,P1,P2,P3,P4}和三種類型的資源{A,B,C},每一種資源的數量分別為10、5、7,在T0時刻的資源分配情況如圖1所示。

Max

ABC

Allocation

ABC

Need

ABC

Available

ABC

P0

753

010

743

332

(230)

P1

322

200

(302)

122

(020)

P2

902

302

600

P3

222

211

011

P4

433

002

相關推薦

python 遞迴深度優先搜尋與廣度優先搜尋演算法模擬實現

一、遞迴原理小案例分析 (1)# 概述 遞迴:即一個函式呼叫了自身,即實現了遞迴 凡是迴圈能做到的事,遞迴一般都能做到! (2)# 寫遞迴的過程 1、寫出臨界條件2、找出這一次和上一次關係3、假設當前函式已經能用,呼叫自身計算上一次的結果,再求出本次的結果 (3)案例分析:求1+2+3+…+n的數和

[C#]銀行家演算法實現

1.死鎖 死鎖,顧名思義,是一種鎖住不可自行解開的死局。 在作業系統中,“死鎖”用於描述資源分配時,程序互相搶佔資源,又因為需求的資源被別的程序搶佔,只好互相等待,以至於等待迴圈中的所有程序均無法正常執行的情況。 死鎖形成需要四個條件,這四個條件缺少一個,就不會形成死鎖。

作業系統處理機排程演算法模擬實現

簡介   多道程式設計中,經常是若干個程序同時處於就緒狀態,為了使系統中的各程序有條不紊地執行,必須選擇某種排程策略,以選擇一個程序佔用處理機。 思路分析   由於本實驗是按照處理機排程演算法模擬實現處理機的排程,與真正的處理機排程過程不完全相同,比如

銀行家演算法java實現

關於銀行家演算法的理論知識,課本或者百度上有好多資料,我就不再多說了,這裡把我最近寫的銀行家演算法的實現帶碼貼出來。由於這是我們的一個實驗,對系統資源數和程序數都指定了,所以這裡也將其指定了,其中系統資源數為3,程序數為5. import java.util.Scanner

銀行家演算法模擬實現

一、設計目的1、瞭解多道程式系統中,多個程序併發執行的資源分配。2、掌握死鎖的產生的原因、產生死鎖的必要條件和處理死鎖的基本方法。3、掌握預防死鎖的方法,系統安全狀態的基本概念。4、掌握銀行家演算法,瞭解資源在程序併發執行中的資源分配策略。5、理解死鎖避免在當前計算機系統不常

模擬實現銀行家調度算法

[] lean print word 模擬 只有一個 序列 iostream 正式 實驗四 模擬實現銀行家調度算法 1.實驗目的 (1)使學生加深對死鎖的理解,理解預防死鎖的思想和方法,使學生明確系統安全狀態的概念。 (2)使學生能利用銀行家調度算法實現避免死鎖。

銀行家演算法實現

#include <iostream> using namespace std; #define n 4 //程序數 #define m 3//資源種類數 typedef struct{ int resource[m]; //不變 int avaliable[m]; int

模擬實現請求分頁虛存頁面替換演算法

編寫程式, 由必要的資料結構、 主函式、 頁面置換演算法函式和顯示記憶體使用函式構成, 模擬實現請求分頁管理中至少兩種頁面替換演算法。要求程式執行時: (1)顯示主選單,包含初始化記憶體、隨機生成頁面訪問序列、模擬程序執行過程、顯示內 存使用情況、顯示程序頁面狀態。 (2)接

圖知識小結5-kruskal演算法的陣列模擬實現與應用

#include <bits/stdc++.h> using namespace std; const int MAX_EDGE = 100000; const int MAX_VERTICES = 100; struct Edge{ int len, u, v; } edge[MAX

實現銀行家演算法和先進先出演算法_從檔案裡讀資料

作業系統考試老師出了兩道題,一個是先進先出,另一個是銀行家演算法,題目如下 1.請使用FCFS演算法模擬程序排程。假設系統有n (n>=2) 個程序,給定程序的到達時間以及需要執行的時間長短,給出相應的執行順序。資料以檔案方式給出,檔名為data.fcfs,格式為: 檔案共n(N1…Nn)

JAVA簡單實現作業系統原理的銀行家演算法

   銀行家演算法是這樣的一種資源分配方法:系統給程序分配資源時,先檢查狀態是否安全,方法是看它是否有足夠的剩餘資源滿足一個距最大需求最近的程序。如果有,那麼分配資源給該程序,然後接著檢查下一個距最大需求最近的程序,如此反覆下去。如果所有的程序都能獲得所需資源,那麼該程序是安

Google的cartographer SLAM演算法在Turtlebot3上的模擬實現教程(中)(已排坑!)

一、前言 該篇為本文的重點,主要內容為 cartographer_turtlrbot3原始碼庫的安裝 二、cartographer_turtlebot原始碼庫安裝 這裡基本參考創客智造的安裝教程,但是由於教程中安裝的一些包版本已經更新,如果完全按照教程走的話 會發現

java實現銀行家演算法

題目: 初始時,Allocate[i,j]=0,表示初始時沒有程序得到任何資源。假定程序對資源的請求序 列為: Request(1)[M]=(1,0,0); Request(2)[M]=(2,1,0); Request(2)[M]=(2,0,1); Reque

【專案】模擬實現磁碟排程演算法--掃描演算法

報告的內容、目的及原理 一、實驗內容 模擬電梯排程演算法,實現對磁碟的驅動排程。  二、實驗目的 磁碟是一種高速、大量旋轉型、可直接存取的儲存裝置。它作為計算機系統的輔助儲存器,負擔著繁重的輸入輸出任務,在多道程式設計系統中,往往同時會有若干個要求訪問磁碟的輸入輸出請示

作業系統課程設計--磁碟排程演算法模擬實現及對比

本來已經做好了個課程設計是銀行家演算法的,不過由於借給同學抄,被老師發現了,要重做...就選了磁碟高度演算法的題目。 實驗要求及提示 1 、首先假設磁碟磁軌數為 1500 ,磁頭初始停止於 0 磁軌。 2 、用隨機數生成函式產生“磁軌號”序列(即磁碟請求的位置),共產生

c++實現銀行家演算法

大三上學期的時候自己寫的銀行家演算法的程式碼,複製貼上到編譯器即可執行,希望幫助到其他人! /* Financier algorithm.(銀行家演算法) */ //=====<head file>==================

避免死鎖的銀行家演算法C++程式實現

 本篇博文為追憶曾經寫過的算法系列第二篇(20081021) 溫故知新 目的:具有代表性的死鎖避免演算法是Dijskstra給出的銀行家演算法。本實驗是基於銀行家演算法的思想通過編寫C++程式實現銀行家演算法的計算機程式化,使其更實用。同時也加深了有關自願申請、避免死

程序排程模擬程式設計-----FCFS演算法簡單實現

題目描述: 一.實驗目的和要求 加深對程序概念和程序排程過程/演算法的理解。本實驗要求用高階語言編寫和除錯一個模擬動態優先權的程序排程演算法程式。 二、實驗內容 1.給出程序排程的演算法描述(如基於動態優先順序和時間片輪轉排程演算法的描述)。 2.用C語言設計一個對n個併發

幾種程序排程演算法模擬C++實現

先到先服務(FCFS)最短作業優先排程演算法(SJF)#include <iostream> #include <queue> #include <algorithm> #include <cstdio> #include &l

程序排程演算法模擬,用動態優先數及時間片輪轉法實現程序排程_Java語言模擬實現

//process類import java.util.Date;public class process {private  int ID_name;    //程序ID名private  int PRIORITY;        //優先數private  int CPUT