📄 死锁.cpp
字号:
#include<stdio.h>
#include <stdlib.h>
#define N 5
#define M 3
#define TRUE 1
#define FALSE 0
int Max[N][M];
int Allocation[N][M];
int Need[N][M];
int Available[M];
int Request[M];
int sort[N];
int num;
void InputFile(){
FILE *fp;
int i,j;
if((fp=fopen("date.dat","wb"))==NULL)
{ printf("cannot open this file\n");
exit(0);}
printf("请输入进程数据\n");
for(i=0;i<N;i++){
printf("请输入进程p%d的数据\n",i);
for(j=0;j<M;j++)
{scanf("%d",&Max[i][j]);fprintf(fp,"%d ",Max[i][j]);}
for(j=0;j<M;j++)
{scanf("%d",&Allocation[i][j]);fprintf(fp,"%d ",Allocation[i][j]);}
/* for(j=0;j<M;j++)
{ scanf("%d",&Need[i][j]);fprintf(fp,%d,Need[i][j]);}*/
}
printf("请输入系统可供分配的资源的总量\n");
for(i=0;i<M;i++)
{ scanf("%d",&Available[i]);
fprintf(fp,"%d ",Available[i]);
}
fclose(fp);
}
void OutputFile(){
FILE *fp;
int i,j;
if((fp=fopen("date.dat","rb"))==NULL)
exit(0);
for(i=0;i<N;i++){
for(j=0;j<M;j++)
fscanf(fp,"%d",&Max[i][j]);
for(j=0;j<M;j++)
fscanf(fp,"%d",&Allocation[i][j]);
}
for(i=0;i<M;i++)
fscanf(fp,"%d",&Available[i]);
fclose(fp);
}
void error(){
printf("Resouces are not enough!\n");
}
void Input(){
int i;
printf("Please input the request process:\n");
scanf("%d",&num);
for(i=0;i<M;i++)
{
printf("input request[%d]: ",i);
scanf("%d",&Request[i]);
}
}
bool test(){
int finish[N];
int work[M];
int i,j,s;
for(i=0;i<N;i++)
finish[i]=FALSE;
for(i=0;i<M;i++)
work[i]=Available[i];
i=0;
s=0;
while(i<N){
if(finish[i]==FALSE){
for(j=0;(j<M)&&(Need[i][j]<=work[j]);j++){}
if(j==M){
finish[i]=TRUE;
printf("Process %d can completed.\n",i);
for(j=0;j<M;j++)
work[j]+=Allocation[i][j];
sort[s]=i;
s++;
i=-1;
}
}
i++;
}
if(s!=N) return false;
else{
printf("存在安全序列:\n");
for(i=0;i<N;i++)
printf("p[%d],",sort[i]);
return true;
}
}
void exam(){
int i;
for(i=0;i<M;i++){
if(!(Request[i]<=Need[num][i])&&(Request[i]<=Available[i]))
error();
}
for (i=0;i<M;i++) {
Allocation[num][i]+=Request[i];
Available[i]-=Request[i];
Need[num][i]-=Request[i];
}
if(test())
printf("The request is allocation to p%d\n",num);
else {
for (i=0;i<M;i++) {
Allocation[num][i]-=Request[i];
Available[i]+=Request[i];
Need[num][i]+=Request[i];
}
printf("不存在安全序列.p%d must wait\n",num);
}
}
void Print(){
int i,j;
printf("当前的资源分配表:\n");
printf(" Max Allocation Need\n");
for(i=0;i<N;i++){
printf("p%d ",i);
for(j=0;j<M;j++)
printf("%d ",Max[i][j]);
printf(" ");
for(j=0;j<M;j++)
printf("%d ",Allocation[i][j]);
printf(" ");
for(j=0;j<M;j++)
printf("%d ",Need[i][j]);
printf("\n");
}
printf("Available: ");
for(i=0;i<M;i++)
printf("%d ",Available[i]);
printf("\n");
}
void main(){
int i,j;int k=0;
char c,d;
printf("是否重新输入数据(y/n)\n");
scanf("%c",&c);
if(c=='y') InputFile();
else OutputFile();
for(i=0;i<N;i++)
for(j=0;j<M;j++)
Need[i][j]=Max[i][j]-Allocation[i][j];
while(1){
Print();
printf("T%d时刻申请资源:\n",k);
Input();
exam();
printf("是否继续进行进程(y/n)\n");
getchar();
scanf("%c",&d);
if(d=='y') k++;
else break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -