實驗六 銀行家算法(下)
一、實驗說明
實驗說明:本次實驗主要是對銀行家算法進行進一步的實踐學習,掌握銀行家算法的整體流程,理解程序測試時每一步的當前狀態,能對當前的資源分配進行預判斷。
二、實驗要求
1、獲取源代碼
2、看懂大致框架
3、嘗試運行并知道運行中輸入的信息的意義
4、通過運行程序分配如下: 總需求:a 8 5 5; b 5 3 4; 已分配:a 4 2 3; b 4 2 2; 現在a 提出分配 1 1 1。 可以分配嗎?
5、請從銀行家算法的理論進行分析上述分配是否會造成死鎖,如果會造成死鎖,說明源代碼并不完整,請同學改進完善源代碼,使其能有效判斷是否存在安全序列,進而拒絕不安全的分配要求。
三、實驗步驟
1、在文檔右邊的虛擬化操作系統中,打開桌面的 Xfce 終端,輸入cd Desktop
2、輸入touch 6-1.c
3、輸入gedit 6-1.c
4、在 gedit 里面輸入源代碼,點擊 save 保存
5、關掉 gedit 編輯器
6、輸入g++ -o 6-1 6-1.c
7、在桌面的 Xfce 終端繼續輸入命令./6-1
8、按要求輸入并運行,觀察結果
9、針對實驗要求5,改進完善源代碼.
四、實驗報告要求 1、通過運行程序分配如下: 總需求:a 8 5 5; b 5 3 4; 已分配:a 4 2 3; b 4 2 2; 現在a 提出分配 1 1 1 完成
2、簡述自己對銀行家算法的理解?
銀行家算法是避免死鎖的算法,在每一個進程進入系統時,都必須申明在運行過程中所需要每種資源的最大單元數目,其數目不嫩超過系統所擁有的資源總量,當進程請求資源時,系統會確認是否有足夠的資源分配給該進程,若有的話,還要進一步判斷如果分配給該進程所申請的資源會不會使系統處于不安全狀態,如果不會,才將資源分配給該進程。
3、針對實驗要求5,改進完善源代碼.對改進之處說明或截圖,并重新進行前面的分配過程,并截圖。
4、將最后的完整源代碼復制。
#include
#include
#include
#include
#include
//#include
const int MAX_P=20;
const int MAXA=10; //定義A類資源的數量
const int MAXB=5;
const int MAXC=7;
using namespace std;
typedef struct node{
int a;
int b;
int c;
int remain_a;
int remain_b;
int remain_c;
}bank;
typedef struct node1{
char name[20];
int a;
int b;
int c;
int need_a;
int need_b;
int need_c;
}process;
bank banker;
process processes[MAX_P];
int quantity;
//初始化函數
void initial()
{
int i;
banker.a=MAXA;
banker.b=MAXB;
banker.c=MAXC;
banker.remain_a=MAXA;
banker.remain_b=MAXB;
banker.remain_c=MAXC;
for(i=0;i
strcpy(processes[i].name,"");
processes[i].a=0;
processes[i].b=0;
processes[i].c=0;
processes[i].need_a=0;
processes[i].need_b=0;
processes[i].need_c=0;
}
}
//新加作業
void add()
{
char name[20];
int flag=0;
int t;
int need_a,need_b,need_c;
int i;
cout<
cout<
cout<
cout<
cin>>name;
for(i=0;i
if(!strcmp(processes[i].name,name)){
flag=1;
break;
}
}
if(flag){
cout<
}
else{
cout<
cin>>need_a;
cout<
cin>>need_b;
cout<
cin>>need_c;
t=1;
cout<
if(need_a>banker.remain_a){
cout<
t=0;
}
if(need_b>banker.remain_b){
cout<
t=0;
}
if(need_c>banker.remain_c){
cout<
t=0;
}
if(t){
strcpy(processes[quantity].name,name);
processes[quantity].need_a=need_a;
processes[quantity].need_b=need_b;
processes[quantity].need_c=need_c;
quantity++;
cout<
}
else{
cout<
}
}
}
//為作業申請資源
void bid()
{
char name[20];
int i,p;
int a,b,c;
int flag;
cout<
cout<
cout<
cin>>name;
p=-1;
for(i=0;i
if(!strcmp(processes[i].name,name)){
p=i;
break;
}
}
if(p!=-1){
cout<
cin>>a;
cout<
cin>>b;
cout<
cin>>c;
flag=1;
if((a>banker.remain_a)||(a>processes[p].need_a-processes[p].a)){
cout<
flag=0;
}
if((b>banker.remain_b)||(b>processes[p].need_b-processes[p].b)){
cout<
flag=0;
}
if((c>banker.remain_c)||(c>processes[p].need_c-processes[p].c)){
cout<
flag=0;
}
if(flag){
banker.remain_a-=a;
banker.remain_b-=b;
banker.remain_c-=c;
processes[p].a+=a;
processes[p].b+=b;
processes[p].c+=c;
cout<
}
else{
cout<
}
}
else{
cout<
}
}
//撤消作業
void finished()
{
char name[20];
int i,p;
cout<
cout<
cout<
cin>>name;
p=-1;
for(i=0;i
if(!strcmp(processes[i].name,name)){
p=i;
break;
}
}
if(p!=-1){
banker.remain_a+=processes[p].a;
banker.remain_b+=processes[p].b;
banker.remain_c+=processes[p].c;
for(i=p;i
processes[i]=processes[i+1];
}
strcpy(processes[quantity-1].name,"");
processes[quantity-1].a=0;
processes[quantity-1].b=0;
processes[quantity-1].c=0;
processes[quantity-1].need_a=0;
processes[quantity-1].need_b=0;
processes[quantity-1].need_c=0;
quantity--;
cout<
}
else{
cout<
}
}
//查看資源情況
void view()
{
int i;
cout<
cout<
cout<
cout<
cout<
cout<
cout<
if(quantity>0){
for(i=0;i
cout<
cout<
cout<
cout<
cout<
}
}
else{
cout<
}
}
//顯示版權信息函數
void version()
{
cout<
cout<
}
int main()
{
int chioce;
int flag=1;
initial();
version();
while(flag){
cout<
cout<
cout<
cout<
cin>>chioce;
switch(chioce){
case 1:
add();
break;
case 2:
bid();
break;
case 3:
finished();
break;
case 4:
view();
break;
case 0:
flag=0;
break;
default:
cout<
}
}
return 0;
}