实验名称:死锁的检测与解除姓名:杨秀龙学号:1107300432专业班级:创新实验班111指导老师:霍林实验题目死锁的检测与解除实验目的为了更清楚系统对死锁是如何检测和当死锁发生时如何解除死锁设计思想首先需要建立和银行家算法类似的数组结构,先把孤立的进程(没有占用资源的进程)放入一个数组中,根据死锁原理,找出既不阻塞又非独立的进程结点,使之成为孤立的结点并放入孤立数组中,再释放该进程的占用资源,继续寻找下一个孤立结点,如果所有进程都能放入孤立数组中,则系统不会发生死锁,如果有进程不能放入,则系统将发生死锁,并进行死锁解除,撤消所有的死锁进程,释放它们占用的资源。主要数据结构和银行家算法类似,需要建立相应的数组intallocation[M][M];intrequest[M][M];intavailable[M];intline[M];//管理不占用资源的进程intno[M];//记录造成死锁的进程intwork[M];流程图开始结束输入总进程数输入资源数输入Request矩阵输入Allocation矩阵是否发生死锁死锁解除否是输入available矩阵运行结果图(1)不会发生死锁时图(1)当发生死锁时附录源代码如下:#includestdio.h#defineM50intallocation[M][M];intrequest[M][M];intavailable[M];intline[M];intno[M];intn,m,i,j,f,a=0;main(){voidcheck();voidremove();voidshow();printf(输入进程总数:);scanf(%d,&n);printf(输入资源种类数量:);scanf(%d,&m);printf(输入进程已占用的资源Allocation:\n);for(i=0;in;i++)for(j=0;jm;j++)scanf(%d,&allocation[i][j]);printf(输入进程的请求矩阵request:\n);for(i=0;in;i++)for(j=0;jm;j++)scanf(%d,&request[i][j]);printf(输入系统可利用资源available:\n);for(j=0;jm;j++)scanf(%d,&available[j]);show();check();f=1;for(i=0;in;i++){if(line[i]==0){f=0;no[a++]=i;//记录死锁序号}}if(f==0){printf(该系统将发生死锁!\n);printf(造成死锁的进程为:);for(i=0;in;i++)printf(%2d,no[i]);printf(\n);remove();show();}else{printf(不会发生死锁!\n);}}voidcheck()//死锁检测{intk,;intx;intwork[M];for(i=0;in;i++)line[i]=0;for(i=0;in;i++)//(2){x=0;for(j=0;jm;j++){if(allocation[i][j]==0)x++;if(x==m)line[i]=1;}}for(j=0;jm;j++)//(3)work[j]=available[j];k=n;do{for(i=0;in;i++){if(line[i]==0){f=1;//空置条件是否满足for(j=0;jm;j++)if(request[i][j]work[j])f=0;if(f==1)//找到满足条件的进程{line[i]=1;for(j=0;jm;j++)work[j]=work[j]+allocation[i][j];//释放资源available[j]=work[j];}}}k--;}while(k0);}voidremove()//死锁解除{for(i=0;in;i++){if(line[i]==0){for(j=0;jm;j++){available[j]+=allocation[i][j];allocation[i][j]=0;request[i][j]=0;}}}printf(死锁解除!\n);}voidshow(){printf(进程);printf();printf(allocation);printf();printf(request);printf();printf(available);printf(\n);for(i=0;in;i++){printf(%2d,i);printf();for(j=0;jm;j++)printf(%2d,allocation[i][j]);printf();for(j=0;jm;j++)printf(%2d,request[i][j]);printf();for(j=0;jm;j++){if(i0)break;printf(%2d,available[j]);}printf(\n);}}