《銀行家算法 實驗資料報告材料》由會員分享,可在線閱讀,更多相關《銀行家算法 實驗資料報告材料(10頁珍藏版)》請在裝配圖網上搜索。
1、word
淮海工學院計算機工程學院
實驗報告書
課程名:《操作系統(tǒng)原理》
題 目: 銀行家算法
班 級:
學 號:
姓 名:
評語:
成績: 指導教師:
批閱時間: 年 月 日
9 / 10
一、實驗目的
銀行家算法是操作系統(tǒng)中防止死鎖的典型算法,本實驗可以加深對銀行家算法的步驟
2、和相關數據結構用法的更好理解。
實驗環(huán)境
實驗學時
4學時,必做實驗。
二、實驗容
用C語言編寫一個簡單的銀行家算法模擬程序,用銀行家算法實現資源分配。程序能模擬多個進程共享多種資源的情形。進程可動態(tài)地申請資源,系統(tǒng)按各進程的申請動態(tài)地分配資源。要求程序具有顯示和打印各進程的某一時刻的資源分配表和安全序列;顯示和打印各進程依次要求申請的資源數量以與為某進程分配資源后的有關資源數據的情況。
三、 實驗說明
實驗中進程的數量、資源的種類以與每種資源的總量Total[j]最好允許動態(tài)指定。初始時每個進程運行過程中的最大資源需求量Max[i,j]和系統(tǒng)已分配給該進程的資源量A
3、llocation[i,j]均為〔這些數值可以在程序運行時動態(tài)輸入〕,而算法中其他數據結構的值〔包括Need[i,j]、Available[j]〕如此需要由程序根據量的值計算產生。
四、 實驗步驟
1、 理解本實驗中關于兩種調度算法的說明。
2、 根據調度算法的說明,畫出相應的程序流程圖。
3、 按照程序流程圖,用C語言編程并實現。
五、分析與思考
1. 要找出某一狀態(tài)下所有可能的安全序列,程序該如何實現?
答:要找出這個狀態(tài)下的所有可能的安全序列,前提是要是使這個系統(tǒng)先處于安全狀態(tài),而
系統(tǒng)的狀態(tài)可通過以下來描述:
進程剩余申請數=最大申請數-占有數; 可分配資源數=
4、總數-占有數之和;
通過這個描述來算出系統(tǒng)是否安全,從而找出所有的安全序列。
2. 銀行家算法的局限性有哪些?
答:銀行家算法是一種最有代表性的防止死鎖的算法。銀行家算法即把操作系統(tǒng)看作是銀行 家,操作系統(tǒng)管理的資源相當于銀行家管理的資金,進程向操作系統(tǒng)請求分配資源相當于用戶向銀行家貸款。操作系統(tǒng)按照銀行家制定的規(guī)如此為進程分配資源,當進程首次申請資源時,要測試該進程對資源的最大需求量,如果系統(tǒng)現存的資源可以滿足它的最大需求量如此按當前的申請量分配資源,否如此就推遲分配。當進程在執(zhí)行中繼續(xù)申請資源時,先測試該進程已占用的資源數與本次申請的資源數之和是否超過了該進程對資源的最大需求
5、量。假設超過如此拒絕分配資源,假設沒有超過如此再測試系統(tǒng)現存的資源能否滿足該進程尚需的最大資源量,假設能滿足如此按當前的申請量分配資源,否如此也要推遲分配。但任何一種算法都存在其缺點,對各進程的資源分配要求嚴格,經常使其處于不安全狀態(tài),銀行家算法的主要局限是過于慎重和檢查各申請者對各類資源的最大需求量開銷較大。
六、測試數據與實驗結果
銀行家算法流程圖〔1〕所示:
完畢
否
是
申請失敗。
以上分配作廢,恢復原來的分配狀態(tài):
Available[j] = Available[j] + Requesti[j]
Allocation[i][j]= Allocation[
6、i][j]-Requesti[j]
Need[i][j] = Need[i][j]+Requesti[j]
N
Y
N
Y
Requesti[j]> Need[i][j]
出錯返回:return(error)
Requesti[j]> Available[j]
出錯返回:(進程阻塞)
return(error)
Available[j] = Available[j] – Requesti[j]
Allocation[i][j]= Allocation[i][j] + Requesti[j]
Need[i][j] = Need[i][j] – Requesti[j]
7、
假定分配:
輸入初始參數〔資源分配與請求情況〕
開始
假定分配之后,系統(tǒng)安全嗎?
申請成功。輸出各種數據的變化
圖〔1〕銀行家算法流程圖
運行結果如圖〔2〕〔3〕所示:
圖〔2〕
圖〔3〕銀行家算法截圖
七、實驗心得與體會
銀行家算法是操作系統(tǒng)中防止死鎖的典型算法。所謂死鎖: 是指兩個或兩個以上的進程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現象,假設無外力作用,它們都將無法推進下去。此時稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產生了死鎖,這些永遠在
8、互相等待的進程稱為死鎖進程。 由于資源占用是互斥的,當某個進程提出申請資源后,使得有關進程在無外力協(xié)助下,永遠分配不到必需的資源而無法繼續(xù)運行,這就產生了一種特殊現象死鎖。
通過這次實驗,加深了我對銀行家算法的了解,掌握了如何利用銀行家算法防止死鎖。在實驗中,難免會遇到問題,通過自己在網上查找資料、詢問同學,這些問題都得到了解決,完成了本次實驗。通過這次的實驗,使我的理論知識更加的結實。
附錄
#include
#include
#include
#define False 0
#define True 1
in
9、t Max[100][100]={0};//各進程所需各類資源的最大需求
int Avaliable[100]={0};//系統(tǒng)可用資源
char name[100]={0};//資源的名稱
int Allocation[100][100]={0};//系統(tǒng)已分配資源
int Need[100][100]={0};//還需要資源
int Request[100]={0};//請求資源向量
int temp[100]={0};//存放安全序列
int Work[100]={0};//存放系統(tǒng)可提供資源
int M=100;//作業(yè)的最大數為100
int N=100;//資源的
10、最大數為100
void showdata()//顯示資源矩陣
{
int i,j;
cout<<"系統(tǒng)目前可用的資源[Avaliable]:"<
11、<"進程名 ";
for(j=0;j<3;j++){
for(i=0;i
12、[j]<<" ";
cout<<" ";
for(j=0;j
13、Request[j];
}
return 1;
}
int safe()//安全性算法
{
int i,k=0,m,apply,Finish[100]={0};
int j;
int flag=0;
Work[0]=Avaliable[0];
Work[1]=Avaliable[1];
Work[2]=Avaliable[2];
for(i=0;i
14、 if(apply==N){
for(m=0;m
15、-1;
}
}
cout<<"系統(tǒng)是安全的!"<";
}
cout<
16、 cin>>i;//輸入須申請的資源號
cout<<"請輸入進程 "<>Request[j];//輸入需要申請的資源
}
for (j=0;jNeed[i][j])//判斷申請是否大于需求,假設大于如此出錯
{
cout<<"進程 "<
17、l;
ch='n';
break;
}
else {
if(Request[j]>Avaliable[j])//判斷申請是否大于當前資源,假設大于如此
{ //出錯
cout<<"進程"<
18、 {
changdata(i);//根據進程需求量變換資源
showdata();//根據進程需求量顯示變換后的資源
safe();//根據進程需求量進展銀行家算法判斷
}
}
void addresources(){//添加資源
int n,flag;
cout<<"請輸入需要添加資源種類的數量:";
cin>>n;
flag=N;
N=N+n;
for(int i=0;i>name[flag];
cout<<"數量:";
cin>>
19、Avaliable[flag++];
}
showdata();
safe();
}
void delresources(){//刪除資源
char ming;
int i,flag=1;
cout<<"請輸入需要刪除的資源名稱:";
do{
cin>>ming;
for(i=0;i
20、{
name[j]=name[j+1];
Avaliable[j]=Avaliable[j+1];
}
N=N-1;
showdata();
safe();
}
void changeresources(){//修改資源函數
cout<<"系統(tǒng)目前可用的資源[Avaliable]:"<>Avaliable[0]>>A
21、valiable[1]>>Avaliable[2];
cout<<"經修改后的系統(tǒng)可用資源為"<>Max[flag][
22、i];
Need[flag][i]=Max[flag][i]-Allocation[flag][i];
}
showdata();
safe();
}
int main()//主函數
{
int i,j,number,choice,m,n,flag;
char ming;
cout<<"*****************單處理機系統(tǒng)進程調度實現*****************"<>n;
N=n;
for(i=0;i
23、1<<"的名稱:";
cin>>ming;
name[i]=ming;
cout<<"資源的數量:";
cin>>number;
Avaliable[i]=number;
}
cout<>m;
M=m;
cout<<"請輸入各進程的最大需求量("<>Max[i][j];
do{
flag=0;
cout<<
24、"請輸入各進程已經申請的資源量("<>Allocation[i][j];
if(Allocation[i][j]>Max[i][j])
flag=1;
Need[i][j]=Max[i][j]-Allocation[i][j];
}
if(flag)
cout<<"申請的資源大于最大需求量,請重新輸入!\n";
}
while(flag
25、);
showdata();//顯示各種資源
safe();//用銀行家算法判定系統(tǒng)是否安全
while(choice)
{
cout<<"**************銀行家算法演示***************"<
26、 4:分配資源 "<>choice;
switch(choice)
{
case 1: addresources();break;
case 2: delresources();break;
case 3: changeresources();break;
case 4: share();break;
case 5: addprocess();break;
case 0: choice=0;break;
default: cout<<"請正確選擇功能號(0-5)!"<