⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4.c

📁 c.rar___z8786052200751110333362469.rar
💻 C
字号:
#include<stdio.h>
#define m 3//资源种类
#define n 4//进程个数
int i,j;
int c[n];
struct state{
int max[n][m];//最大资源需求总量
int alloc[n][m];//已分配的资源数量
int need[n][m];//还需要申请的资源数
int available[m];//剩余的资源数
}p;
bool Safe(state s);
void Output()
{printf("最大资源需求总量:");
printf("\n");
for(i=0;i<n;i++)
{for(j=0;j<m;j++)
printf("%d  ",p.max[i][j]);
printf("\n");}
printf("\n");
printf("已分配的资源数量");
printf("\n");
for(i=0;i<n;i++)
{for(j=0;j<m;j++)
printf("%d  ",p.alloc[i][j]);
printf("\n");}
printf("还需要申请的资源数");
printf("\n");
for(i=0;i<n;i++)
{for(j=0;j<m;j++)
printf("%d  ",p.need[i][j]);
printf("\n");
}
printf("剩余的资源数");
printf("\n");
for(i=0;i<m;i++)
printf("%d  ",p.available[i]);
}
void Input(){
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&p.max[i][j]);
for(i=0;i<n;i++)
for(j=0;j<m;j++) 
{scanf("%d",&p.alloc[i][j]);
p.need[i][j]=p.max[i][j]-p.alloc[i][j];
}
for(i=0;i<m;i++)
scanf("%d",&p.available[i]);
}
void SafeId(){
if (Safe(p))
{printf("在T0时刻的安全序列是");
for(i=0;i<n;i++)
printf("%d ",c[i]);}
else
printf("在T0时刻不安全");
}
void Assin(int request[],int k){
bool bj=false;
for(i=0;i<m;i++)
if (request[i]>p.need[k][i]) bj=true;
if (bj==true)
{
printf("error");
return;
}
for(i=0;i<m;i++) 
if(request[i]>p.available[i]) bj=true;
if (bj==true)
{
printf("wait...");
return;
}
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.alloc[k][i]=p.alloc[k][i]+request[i];
}
if (Safe(p))
{printf("分配成功,安全序列是");
for(i=0;i<n;i++)
printf("%d ",c[i]);
return;}
printf("分配失败,开始回收....");
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.alloc[k][i]=p.alloc[k][i]-request[i];
}
}
bool Safe(state s){
int flag=1,r=0,l=0;
int work[m];
bool finsh[n],rest=true;
for(i=0;i<n;i++)
finsh[i]=false;
for(i=0;i<m;i++)
work[i]=s.available[i];
do {
for(i=0;i<n;i++)
{ 
if(finsh[i]==false){
for(j=0;j<m;j++)
{if(work[j]<s.need[i][j]){
flag=0;
break;}
}
if(j>=m){
flag=1;
finsh[i]=true;
c[l]=i;
l++;
for (j=0;j<m;j++)
work[j]=work[j]+s.alloc[i][j]; 
}
}
}
r=r+1;
}
while(r<n); 
if(flag==0) rest=false;
/*if(rest==true){
for(i=0;i<n;i++)
printf("%d",c[i]);}*/
return rest; 
}

void main(){
Input();
Output();
SafeId();
printf("请输入申请种类资源的进程q=");
int q;
scanf("%d",&q);
if (q>n)
printf("error");
else
{int a[m];
printf("请输入进程q申请各类资源的数量");
for(i=0;i<m;i++)
scanf("%d",&a[i]);
Assin(a,q);
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -