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

📄 死锁.cpp

📁 操作系统中银行家算法实现科技的方式卡萨合法的卡萨合法
💻 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 + -