作業系統實驗:銀行家演算法(C語言)

Baal Austin發表於2020-11-22

實驗內容:

某系統中程式P1、P2、P3……Pn,同時請求資源R1、R2、R3……Rn,已知t0時刻資源分配情況(參考下表)。
(1)編寫程式,分析當前系統狀態是否安全,若系統安全,請輸出安全序列。
(2)在系統安全的情況下,若有程式提出資源請求(如t1時刻程式P2提出請求Rq(1,2,2,2)),分析系統可否響應該請求。
程式

實驗目的:

1.加深瞭解有關資源申請、避免死鎖等概念;
2.體會和了解死鎖和避免死鎖的具體實施方法;
3.掌握銀行家演算法,設計實驗資料驗證其分配策略。

實驗原理:問題分析及演算法設計(流程圖)

問題:如何尋找安全分配策略
使用遞迴演算法,判斷當前程式是否能獲取資源,能則標記當前程式訪問過,遞迴判斷未訪問的程式,如果所有程式訪問完成返回true,如果都不能獲取資源返回false

實驗程式碼:

#include "stdio.h"
#include "string.h"
typedef struct resource_allocation{
	char name[10]; 
	int Work[10]; 
	int Max[10];
	int Allocation[10];
	int Need[10];
	int Work_Allocation[10];
}RA;

int visited[10];
RA ra1[10];
int ra1_count = 0;
bool check_security(RA* ra,int* Init_Available,int resourse_count,int process_count,int count){
	if(count == process_count){
		return true;
	}
	for(int i = 0; i < process_count; i++){
		if(visited[i] == 1){
			continue;
		}
		int flag = 1;
		//判斷當前程式是否滿足條件 
		for(int j = 0; j < resourse_count; j++){
			if(ra[i].Need[j] > Init_Available[j]){
				flag = 0;
				break; 
			}
		} 
		if(flag == 1){
			visited[i] = 1;
			for(int j = 0; j < resourse_count; j++){
				ra[i].Work_Allocation[j] = ra[i].Allocation[j]+Init_Available[j];
				ra[i].Work[j] = Init_Available[j];
				Init_Available[j] = ra[i].Work_Allocation[j];
			}
			//按順序儲存在ra1中 
			ra1[count] = ra[i];
			//判斷是否有安全程式,有則返回true,沒有則繼續查詢 
			if(check_security(ra,Init_Available,resourse_count,process_count,count+1)){
				return true;
			}else{
				visited[i] = 0;
				for(int j = 0; j < resourse_count; j++){
					Init_Available[j] = ra[i].Work[j];
				}
			}
		}
	}
	return false;
}
/*
4
5
1 6 2 2
P0
0 0 4 4
0 0 3 2
0 0 1 2
P1
2 7 5 0
1 0 0 0
1 7 5 0
P2
3 6 10 10
1 3 5 4
2 3 5 6
P3
0 9 8 5
0 3 3 3
0 6 5 2
P4
0 6 6 10
0 0 1 4
0 6 5 6
*/
int main(){
	int resourse_count;
	printf("請輸入資源數:"); 
	scanf("%d",&resourse_count);
	int process_count;
	printf("請輸入程式數:") ;
	scanf("%d",&process_count);
	RA ra[10];//資源分配 
	int Init_Available[10];//初始總資源
	printf("請輸入總資源:") ;
	for(int i = 0; i < resourse_count; i++){
		scanf("%d",&Init_Available[i]);
	}
	printf("請輸入各程式分配的資源:\n"); 
	for(int i = 0; i < process_count; i++){
		getchar(); 
		printf("請輸入程式名:");
		scanf("%s",ra[i].name);
		printf("請輸入%s資源MAX:",ra[i].name); 
		for(int j = 0; j <resourse_count; j++){
			scanf("%d",&ra[i].Max[j]);
		}
		printf("請輸入%s資源Allocation:",ra[i].name); 
		for(int j = 0; j <resourse_count; j++){
			scanf("%d",&ra[i].Allocation[j]);
		}
		printf("請輸入%s資源Need:",ra[i].name); 
		for(int j = 0; j <resourse_count; j++){
			scanf("%d",&ra[i].Need[j]);
		}
	}
	if(check_security(ra,Init_Available,resourse_count,process_count,0)){
		printf("能找到一個安全序列:");
		for(int i = 0 ; i <  process_count; i++){
			printf("%s ",ra1[i].name);
		}
		printf("\n");
		printf("資源\tWork\t\tNeed\t\tAllocation\tWork+Allocation\t\tfinish\n");
		printf("程式\tA B C D\t\tA B C D\t\tA B C D\t\tA B C D\t\tA B C D\n");
		for(int i = 0; i < process_count; i++){
			printf("%s\t",ra1[i].name);
			for(int j = 0; j < resourse_count; j++){
				printf("%d ",ra1[i].Work[j]);
			} 
			printf("\t");
			for(int j = 0; j < resourse_count; j++){
				printf("%d ",ra1[i].Need[j]);
			} 
			printf("\t");
			for(int j = 0; j < resourse_count; j++){
				printf("%d ",ra1[i].Allocation[j]);
			} 
			printf("\t");
			for(int j = 0; j < resourse_count; j++){
				printf("%d ",ra1[i].Work_Allocation[j]);
			} 
			printf("\ttrue\n");
		}
		printf("因為P2在ti時刻 Rq(1,2,2,2)<Need(2,3,5,6) 並且  Rq(1,2,2,2)<Available(1,6,5,4)\n");
		 printf("所以系統可響應該請求\n"); 
	}else{
		printf("不能找到一個安全序列\n"); 
	}
}

實驗結果:(截圖)

在這裡插入圖片描述

實驗總結:(心得體會)

通過此次實驗對安全檢查的思路有了更深的理解,對死鎖的機制,資源申請的有關概念更加熟悉。

相關文章