天天看點

銀行家算法_作業系統

銀行家算法_作業系統

    • 一、實驗内容
    • 二、實驗準備
    • 三、實驗截圖
    • 三、程式源代碼 - -Java- -

一、實驗内容

編制模拟銀行間算法的程式,并以下面給出的例子驗證所編寫的程式的正确性。

例3-1 某系統有A、 B、 C、 D4類資源共5個程序(P0、 P1、 P2、 P3、 P4)共享, 1各程序對資源的需求和配置設定情況如表3 - 1所示。

銀行家算法_作業系統

現在系統中A、 B、 C、 D4類資源分别還剩1、5、2、 0個,請按銀行家算法回答下列問題:

① 現在系統是否處于安全狀态?

②如果現在程序P1提出需要(o、4、2、 0)個資源的請求,系統能否滿足它的

在該實驗中涉及銀行家算法和安全檢査性算法;- 下事:分 别對兩種算法作具體的介紹 。

二、實驗準備

1.銀行家算法

在避免死鎖的方法中, 如果所施加的限制條件較弱, 有可能獲得令人滿意的系統性能。在該方法中把系統的狀态分為安全狀态和不安全狀态,隻要能使系統始終都處于安全狀系度可以避免發生死鎖。

.

基本思想是配置設定資源之前,判斷系統是否是安全的;若安全,才配置設定。它是最具有代.生的避免死鎖的算法,具體算法如下表示:

假設程序 P提出請求 Request[i],則銀行家算法按如下步驟進行判斷。

Step1:如果Request[i]<=Need[i],則轉向 Step2;否則,出錯

Step2:如果Request[i]<=Available[i],則轉向 Step3;否則, 出錯。

Step3:系統試探配置設定相關資源,修改相關資料:

Available[i]=Available[i]-Request[i] , …

Available[i]=Available[i]+ Request[i] ,

Need[i]=Need[i]- Request[i] ,

SteP4:系統執行安全性檢査,如安全,則配置設定成立;否則試探性配置設定資源廢棄,系名次複原狀 程序進人等待态。

:’

根據以上的銀行家算法步驟, 可得出如圖所示3-1的銀行家算法程式流程圖 。

如圖3 -1銀行家算法程式流程圖  。
           
銀行家算法_作業系統

2.安全性檢查算法

安全性檢查算法主要是根據銀行家算法進行資源配置設定後,檢查資源配置設定後的系統狀态是否處于安全狀态之中。具體算法如下所示:

step1: 設定兩個工作向量 Work=Available, Finish=false;

step2 : 從程序集合中找到一個滿足下述條件的程序;

Finish=false,

Need<=Work,

如果能夠找到該程序, 則執行 Step3, 否則, 執行 Step4;

Step3:假設上述找到的程序獲得資源,可順利執行,直至完成,進而釋放資源。

Work=Work十A:L1ocation,

Finish=true,

Goto Step2;

Step4:如果所有程序的 Finish=true,則表示該系統安全;否則系統不安全。

根據以上安全性檢査算法的步驟, 可得出如圖3 - 2所示的安全性檢査算法程式流程圖 。

如圖3 - 2安全性檢査算法程式流程圖 。
           
銀行家算法_作業系統

三、實驗截圖

銀行家算法_作業系統

三、程式源代碼 - -Java- -

package jincheng;

class Pid{
	static char[]resource;//資源類别
	static int[]available;//現在剩餘資源
	int[]request;//申請資源數量
	{
		request=new int [Pid.resource.length];
	}
	
	
	boolean finish;
	{
		finish=false;
	}
	int[]allocation;//已經占用資源
	int[]maxneed;//程序所需要最大資源
	int[]need;//程序現在需要資源
	{
		allocation=new int [Pid.resource.length];
		maxneed=new int [Pid.resource.length];
		need=new int [Pid.resource.length];
	}
	//初始化
	public Pid(int[] allocation, int[] maxneed) {
		this.allocation = allocation;
		this.maxneed = maxneed;
	}
	
	public int[] getRequest() {
		return request;
	}

	public void setRequest(int[] request) {
		this.request = request;
	}

	public int[] getAllocation() {
		return allocation;
	}
	
	public int[] getMaxneed() {
		return maxneed;
	}
	
	
	
	public void show() {
		for(int a:this.getAllocation()) {
			System.out.print(a +" ");
		}
	}

}

public class BankDemo426 {
	static int []x=new int[5];
	public static void main(String[] args) {
		//靜态 資源類别資源剩餘數量初始化
		char []res= {'A','B','C','D'};Pid.resource=res;
		int len=Pid.resource.length;
		int []ava= {1,5,2,0};Pid.available=ava;
		//占用資源allocation最大資源maxneed初始化
		int []a0= {0,0,1,2};int[]b0= {0,0,1,2};Pid p0=new Pid(a0,b0);
		int []a1= {1,0,0,0};int[]b1= {1,7,5,0};Pid p1=new Pid(a1,b1);
		int []a2= {1,3,5,4};int[]b2= {2,3,5,6};Pid p2=new Pid(a2,b2);
		int []a3= {0,6,3,2};int[]b3= {0,6,5,2};Pid p3=new Pid(a3,b3);
		int []a4= {0,0,1,4};int[]b4= {0,6,5,6};Pid p4=new Pid(a4,b4);
		//申請資源request初始化
		int []c1= {0,4,2,0};p1.setRequest(c1);
		Pid []p=new Pid[5];
		//程序加載p
		p[0]=p0;p[1]=p1;p[2]=p2;p[3]=p3;p[4]=p4;
		//need ins
		for (Pid pi:p) {
			for(int j=0;j<len;j++)
				pi.need[j]=pi.maxneed[j]-pi.allocation[j];
		}
		if(bankFun(p,1)) {
			System.out.println("--配置設定成立");
			System.out.print("安全順序:");
			for(int px:x) {
				System.out.print("p"+px+" ");
			}
		}			
		else
			System.out.println("--配置設定失敗");		
	}
	//銀行家算法
	public static boolean bankFun(Pid []p,int n) {
		int len=Pid.resource.length;
		//step1 Request[i]<=Need[i]
		for (int i = 0; i < len; i++) {
			if(p[n].request[i]>p[n].need[i]) {
				System.out.println("--Request[i]<=Need[i] error");
				return false;
			}
		}
		System.out.println("1.Request[i]<=Need[i]");
		//step2 Request[i]<=Available[i]
		for (int i = 0; i < len; i++) {
			if(p[n].request[i]>Pid.available[i]) {
				System.out.println("--Request[i]<=Available[i] error");
				return false;
			}
		}
		System.out.println("2.Request[i]<=Available[i]");
		//step3 系統試探配置設定相關資源
		int []memava=Pid.available;
		int []memall=p[n].allocation;
		int []memnee=p[n].need;
		for(int i=0;i<len;i++) {
			Pid.available[i]-=p[n].request[i];
			p[n].allocation[i]+=p[n].request[i];
			p[n].need[i]-=p[n].request[i];
		}
		System.out.println("3.系統試探配置設定相關資源");
		//setp4 系統執行安全性檢査
		System.out.println("4.系統執行安全性檢査");
		if(safeFun(p)) {
			return true;
		}
		else {
			System.out.println("--失敗 已恢複");
			Pid.available=memava;
			p[n].allocation=memall;
			p[n].need=memnee;
			return false;
		}
	}
	public static boolean safeFun(Pid []p) {
		int len=Pid.resource.length;
		/*資料  檢測
		for(Pid pi:p) {
			for (int i = 0; i < pi.need.length; i++) {
				System.out.print(pi.need[i]);
			}	
			System.out.println();
		}		
		for(Pid pi:p) {
			for (int i = 0; i < pi.allocation.length; i++) {
				System.out.print(pi.allocation[i]);
			}	
			System.out.println();
		}	
		*/
		//setp1 Work=Available, Finish=false;
		int []work=Pid.available;	
		
		System.out.println("a.Work=Available, Finish=false;");
		//setp2 Finish=false;Need<=Work;
		for(int i=0,k=0;i<p.length;i++) {
			if(!p[i].finish&&cheekNK(p[i],work)) {
				System.out.println("b.可以執行p"+i);
				//step3 順利執行,直至完成,進而釋放資源
				for(int j=0;j<len;j++) {
					work[j]+=p[i].allocation[j];
				}
				p[i].finish=true;
				System.out.println("c.p"+i+"順利執行,釋放資源");
				x[k]=i;k++;
				i=0;
			}
		}
		//step4  所有程序的 Finish=true
		System.out.println("d.程序安全檢測");
		for(Pid pi:p) {
			if(!pi.finish) {
				System.out.println("--有程序不能執行");
				System.out.println("--不安全");
				return false;
			}	
		}
		System.out.println("--所有程序的 Finish=true");
		System.out.println("--安全");
		return true;
	}
	public static boolean cheekNK(Pid pi,int []work) {
		for(int i=0;i<pi.need.length;i++) {
			if(pi.need[i]>work[i]) {				
				return false;
			}				
		}
		return true;
	}
}