?? 銀行家算法實現系統資源管理.cpp
字號:
#include<stdio.h>
#define m 4//資源種類
#define n 5//進程個數
int i,j, pr[n];//pr[n]進程編號
struct process //將進程定義為結構體類型,便于引用
{
int allocation[n][m];//已分配的資源數量
int need[n][m];//還需要申請的資源數
int available[m];//可用資源數
int add[m];//添加資源時,用于輸入
int del[m];//刪除資源時用
}p;
void Input()//輸入功能
{ printf("已分配的資源量:\n");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
scanf("%d",&p.allocation[i][j]);
}
printf("\n請輸入資源需求量:\n");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
scanf("%d",&p.need[i][j]);
}
printf("可用的資源:");
for(i=0;i<m;i++)
scanf("%d",&p.available[i]);
}
void Output()//顯示系統資源
{
printf("顯示系統資源使用分配情況: \n");
printf("已分配的資源數量 ");
printf("還需要申請的資源數");
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)//已分配的資源數量
{
printf("%d ",p.allocation[i][j]);
}
printf(" ");
for(j=0;j<m;j++)//還需要申請的資源數
{
printf("%d ",p.need[i][j]);
}
printf("\n");
}
printf("\n可用資源數:");//可用的資源
for(i=0;i<m;i++)
printf("%d ",p.available[i]);
printf("\n");
}
bool Safe(process g)//安全性算法
{
int flag=1;
int r=0,l=0;//r標明所有進程的安全狀態,l進程編號
int work[m];//工作向量,標明系統可提供給進程繼續運行所需的各類資源數
bool finsh[n],rest=true;//rest 用于標記是否為1,1代表安全
for(i=0;i<n;i++)//為每個進程的finish賦值為false
finsh[i]=false;
for(i=0;i<m;i++)
work[i]=g.available[i];//可用資源標記為work 防止修改時混亂
do
{
for(i=0;i<n;i++)
{
if(finsh[i]==false)
{
for(j=0;j<m;j++)//work<need 說明資源不充足,逐類資源進行驗算
{
if(work[j]<g.need[i][j])
{
flag=0;//不安全置為0
break;
}
}
if(j>=m) //如果j>=m說明work >=need資源充足,逐類資源進行驗算
{
flag=1;//表明安全
finsh[i]=true;
pr[l]=i;//標記進程號
l++;
for (j=0;j<m;j++)
work[j]=work[j]+g.allocation[i][j];
}
}
}
r=r+1;//共循環次數 直到所有進程都安全 或不安全為止
}while(r<n);
if(flag==0)
rest=false;//不安全
return rest; //返回rest的值判斷是否安全
}
void Safe()//輸出安全序列
{
if (Safe(p))
{
for(i=0;i<n;i++)
printf("p%d ",i);
printf("在該時刻的安全序列是");
for(i=0;i<n;i++)
printf("p%d ",pr[i]);
}
else
printf("\n在該時刻不安全!\n\n");
}
void add( )//添加資源
{
printf("添加可用的資源:");
int add[m];
for(i=0;i<m;i++)
scanf("%d",&p.add[i]);
for(i=0;i<m;i++)
p.available[i]=p.available[i]+p.add[i];
printf("\n此時可用資源為: ");
for(i=0;i<m;i++)
printf("%d ",p.available[i]);
}
void del()//刪除資源
{
printf("刪除可用的資源:");
int add[m];
for(i=0;i<m;i++)
scanf("%d",&p.del[i]);
for(i=0;i<m;i++)
p.available[i]=p.available[i]-p.del[i];
printf("\n此時可用資源為: ");
for(i=0;i<m;i++)
printf("%d ",p.available[i]);
}
void request(int request[],int k)//第K個進程申請資源
{
bool bj=false;//初始值為false
for(i=0;i<m;i++)
if (request[i]>p.need[k][i]) bj=true;
if (bj==true)
{
printf("請求資源大于需要的資源!可選擇添加資源");
return;
}
for(i=0;i<m;i++)
if(request[i]>p.available[i]) bj=true;
if (bj==true)
{
printf("需要添加資源,可用資源不充足!");
return;
}
int a[m],b[m],c[m],d[m];
for(i=0;i<m;i++)//當bj不等于true時,對m種資源進行更新
{
a[i]=p.available[i]=p.available[i]-request[i];
b[i]=p.need[k][i]=p.need[k][i]-request[i];
c[i]=p.allocation[k][i]=p.allocation[k][i]+request[i];
}
if (Safe(p))
{
printf("分配成功,安全序列是");
for(i=0;i<n;i++)
printf("%d ",pr[i]);
printf("\n\n第%d個進程當前資源為:\n",k);
printf("已分配資源 需要資源 請求的資源\n");
for (i=0;i<m;i++)//輸出當前進程的請求情況及資源情況
printf("%d ",c[i]);
printf(" ");
for (i=0;i<m;i++)
printf("%d ",b[i]);
printf(" ");
for (i=0;i<m;i++)
printf("%d ",request[i]);
printf("\n可用資源為:");
for (i=0;i<m;i++)//退出前還原為初始狀態
{
d[i]=a[i]+c[i];
printf("%d ",d[i]);
}
for(i=0;i<m;i++)//還原
{
p.available[i]=p.available[i]+request[i];
p.need[k][i]=p.need[k][i]+request[i];
p.allocation[k][i]=p.allocation[k][i]-request[i];
}
return;
}
printf("\n結果如下:系統不安全,分配失敗");
printf("\n\n回收完畢!");
for(i=0;i<m;i++)//還原
{
p.available[i]=p.available[i]+request[i];
p.need[k][i]=p.need[k][i]+request[i];
p.allocation[k][i]=p.allocation[k][i]-request[i];
}
printf("第%d個進程當前資源為:\n",k);
printf("已分配資源 需要資源 請求的資源\n");
for (i=0;i<m;i++)//輸出當前進程的請求情況及資源情況
printf("%d ",p.allocation[k][i]);
printf(" ");
for (i=0;i<m;i++)
printf("%d ",p.need[k][i]);
printf(" ");
for (i=0;i<m;i++)
printf("%d ",request[i]);
}
void main()//主程序
{
while(1)
{
printf("\n************歡迎使用系統資源管理(用銀行家算法實現)************");
printf("\n 設計者:05多媒體1班 梁燕 \n");
printf("\n 1 初始化系統資源 2 添加資源 ");
printf("\n 3 刪除資源 4 申請資源 ");
printf("\n 5 銀行家算法 6 顯示系統資源 ");
printf("\n 7 退出資源管理系統 \n");
printf("\n**************************謝謝使用****************************\n\n");
printf("\n請輸入你的選擇:");
int p;
scanf("%d",&p);
if(p>0&&p<=7)
{
switch(p)
{ case 1: Input();
Output();
break;
case 2: add() ;break;
case 3: del() ;break;
case 4:
printf("\n請輸入申請資源的進程號:p");
int q;
scanf("%d",&q);
if (q>n)
printf("不存在該進程!\n");
else
{ int a[m];
printf("請輸入進程申請各類資源的數量:");
for(i=0;i<m;i++)
scanf("%d",&a[i]);
request(a,q);
};
break;
case 5: Output();
Safe();break;
case 6: Output();
break;
case 7: printf("退出成功!\n");return;
}
}
else printf("輸入錯誤,請重新輸入!");
}
}
/*測試數據:Allocation Need Available
p0 0032 0012 1622
p1 1000 1750
p2 1354 2356
p3 0332 0652
p4 0014 0656
p2提出請求:1 2 2 2*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -