作業系統實驗:銀行家演算法(C語言)
實驗內容:
某系統中程式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");
}
}
實驗結果:(截圖)
實驗總結:(心得體會)
通過此次實驗對安全檢查的思路有了更深的理解,對死鎖的機制,資源申請的有關概念更加熟悉。
相關文章
- 【作業系統】銀行家演算法實現(C語言)作業系統演算法C語言
- 用java語言,模擬實現作業系統的銀行家演算法。Java作業系統演算法
- 【作業系統】銀行家演算法作業系統演算法
- [作業系統]銀行家演算法作業系統演算法
- C語言實驗作業C語言
- 作業系統與c語言作業系統C語言
- 用銀行家演算法實現系統資源分配薦演算法
- 【作業系統】頁面置換演算法(最佳置換演算法)(C語言實現)作業系統演算法C語言
- 銀行家演算法演算法
- c語言作業C語言
- c語音實驗1作業
- 作業系統:程式狀態轉換模擬,C語言實現作業系統C語言
- 作業系統綜合題之“銀行家演算法,畫出試分配後的資源分配狀態圖”作業系統演算法
- C語言作業1。C語言
- C語言作業2C語言
- C語言編寫作業系統有什麼好處C語言作業系統
- 作業系統綜合題之“銀行家演算法,計算各資源總數和Need還需要數量”作業系統演算法
- 作業系統實驗六實驗報告作業系統
- 作業系統實驗七實驗報告作業系統
- 作業系統實驗——程式控制作業系統
- 作業系統之“實驗一”作業系統
- 手機寫作業系統之 使用C語言編寫核心作業系統C語言
- C語言實驗1C語言
- C語言實驗二C語言
- 作業系統實驗4 系統呼叫聯絡作業系統
- 實驗0、瞭解和熟悉作業系統實驗作業系統
- linux作業系統下c語言程式設計入門(1)(轉)Linux作業系統C語言程式設計
- linux作業系統下c語言程式設計入門(2)(轉)Linux作業系統C語言程式設計
- c語言程式實驗————實驗報告十二C語言
- c語言程式實驗——實驗報告五C語言
- c語言程式實驗————實驗報告十C語言
- C語言實戰!!!:商城系統模擬C語言
- 語言是思考的作業系統 - François Chollet作業系統
- C語言I部落格作業07C語言
- C語言I部落格作業05C語言
- C語言I部落格作業04C語言
- C語言I博課作業04C語言
- C語言I部落格作業03C語言