您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 操作系统实验报告-死锁的检测与解除
操作系统实验报告实验题目:死锁的检测与解除学生姓名:田凯飞学生学号:1107300215学生班级:计科111指导老师:霍林实验题目:死锁的检测与解除。实验目的:在实验一中我们可以通过银行家算法和安全性检测来对系统对进程分配资源时进行安全性检测,这是避免系统发生死锁的有效方法,但是假如系统真的发生死锁的时候,系统也必须对此采取有效的措施,通过该实验我们可以深刻的认识系统对死锁的检测与解除的方法。设计思想:该程序是在银行家算法的基础上添加了死锁的解除模块得来的,死锁的解除采用的方法是:当系统发生死锁时,找到已分配资源最大的死锁进程,剥夺其已分配资源,再次检测是否发生死锁。数据结构:1)可用资源向量available:这是一个含有m个元素的数组,其中的每一个元素代表一类可利用资源数目。2)最大需求矩阵max它是一个nm的矩阵,定义了系统中n个进程中得每一个进程对m类资源的最大需求。3)可分配矩阵allocation:这也一个nm的矩阵,定义了系统中每一类资源当前已分配给每一进程的资源数。4)需求矩阵need:这表示每一个进程尚需的各类资源数。5)need[i][j]=max[i][j]-allocation[i][j]。变量说明:可用资源向量available[3];最大需求矩阵max[4][3];可分配矩阵allocation[4][3];需求矩阵need[4][3];进程状态标识finish[4];流程图:否是否是运行结果:无死锁:算法开始输入各进程的最大需求资源、已分配资源和可利用资源数显示各进程的最大需求资源、已分配资源和可利用资源数选择进程并进行资源请求请求是否合法分配资源是否死锁输出进程序列以及该时刻的资源分配情况解除占用资源最多的进程算法结束有死锁:有连续死锁:实验代码:#includestdio.h#defineM4//进程数#defineN3//资源种类数intavailable[3]={0,0,0};//各进程可利用的资源情况intmax[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};//各进程最大需求的资源情况intallocation[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};//各进程已经分配的资源情况intneed[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};//各进程仍需要的资源情况intrequest[3]={0,0,0};//某进程请求的资源情况/***************输入初始的资源状况***************/voidinput(){inti=0,j=0;printf(\t\t\t\tABC\n);printf(请输入进程0对3类资源的最大需求:);for(j=0;j3;j++){scanf(%d,&max[0][j]);}printf(\n);printf(请输入进程1对3类资源的最大需求:);for(j=0;j3;j++){scanf(%d,&max[1][j]);}printf(\n);printf(请输入进程2对3类资源的最大需求:);for(j=0;j3;j++){scanf(%d,&max[2][j]);}printf(\n);printf(请输入进程3对3类资源的最大需求:);for(j=0;j3;j++){scanf(%d,&max[3][j]);}printf(\n);printf(请输入进程0已分配的3类资源量:);for(j=0;j3;j++){scanf(%d,&allocation[0][j]);}printf(\n);printf(请输入进程1已分配的3类资源量:);for(j=0;j3;j++){scanf(%d,&allocation[1][j]);}printf(\n);printf(请输入进程2已分配的3类资源量:);for(j=0;j3;j++){scanf(%d,&allocation[2][j]);}printf(\n);printf(请输入进程3已分配的3类资源量:);for(j=0;j3;j++){scanf(%d,&allocation[3][j]);}printf(\n);printf(请输入可利用的3类资源量:);for(j=0;j3;j++){scanf(%d,&available[j]);}for(i=0;i4;i++)for(j=0;j3;j++){need[i][j]=max[i][j]-allocation[i][j];}printf(\n);}/***************显示当前的资源状况***************/voidoutput(){inti=0,j=0;printf(该时刻3类资源的分配情况如下:\n);printf(\tMAX\t\tALOCAT\t\tNEED\t\tAVAILABLE\n);printf(进程0:\t);for(j=0;j3;j++){printf(%d,max[0][j]);}printf(\t);for(j=0;j3;j++){printf(%d,allocation[0][j]);}printf(\t);for(j=0;j3;j++){printf(%d,need[0][j]);}printf(\t);for(j=0;j3;j++){printf(%d,available[j]);}printf(\n);printf(进程1:\t);for(j=0;j3;j++){printf(%d,max[1][j]);}printf(\t);for(j=0;j3;j++){printf(%d,allocation[1][j]);}printf(\t);for(j=0;j3;j++){printf(%d,need[1][j]);}printf(\n);printf(进程2:\t);for(j=0;j3;j++){printf(%d,max[2][j]);}printf(\t);for(j=0;j3;j++){printf(%d,allocation[2][j]);}printf(\t);for(j=0;j3;j++){printf(%d,need[2][j]);}printf(\n);printf(进程3:\t);for(j=0;j3;j++){printf(%d,max[3][j]);}printf(\t);for(j=0;j3;j++){printf(%d,allocation[3][j]);}printf(\t);for(j=0;j3;j++){printf(%d,need[3][j]);}printf(\n);}/***************给某进程分配资源***************/voidchange(intn){intj;for(j=0;jN;j++){available[j]=available[j]-request[j];allocation[n][j]=allocation[n][j]+request[j];need[n][j]=need[n][j]-request[j];}}/***************找出占用资源最多的进程***************/intfindmany(){inti=0,j=0,k=0,l=0;i=allocation[0][0]+allocation[0][1];i+=allocation[0][2];j=allocation[1][0]+allocation[1][1];j+=allocation[1][2];k=allocation[2][0]+allocation[2][1];k+=allocation[2][2];l=allocation[3][0]+allocation[3][1];l+=allocation[3][2];if(i=j){if(i=k){if(i=l)return0;elsereturn3;}else{if(k=l)return2;elsereturn3;}}else{if(j=k){if(j=l)return1;elsereturn3;}else{if(k=l)return2;elsereturn3;}}}/***************找出需要资源最少的进程***************/intfindfew(){inti=0,j=0,k=0,l=0;i=need[0][0]+need[0][1];i+=need[0][2];j=need[1][0]+need[1][1];j+=need[1][2];k=need[2][0]+need[2][1];k+=need[2][2];l=need[3][0]+need[3][1];l+=need[3][2];if(i=j){if(i=k){if(i=l)return0;elsereturn3;}else{if(k=l)return2;elsereturn3;}}else{if(j=k){if(j=l)return1;elsereturn3;}else{if(k=l)return2;elsereturn3;}}}/***************安全性检测***************/intchecksafe(intn){intwork[3],finish[M],que[M];inti=0,k=0;for(i=0;iM;i++)finish[i]=false;for(;;){work[0]=available[0];work[1]=available[1];work[2]=available[2];i=n;while(iM){if(finish[i]==false&&need[i][0]=work[0]&&need[i][1]=work[1]&&need[i][2]=work[2]){work[0]+=allocation[i][0];work[1]+=allocation[i][1];work[2]+=allocation[i][2];finish[i]=true;que[k]=i;k++;i=0;}elsei++;}for(i=0;iM;i++)if(finish[i]==false){printf(存在死锁!\n);return1;break;}break;}printf(\n);printf(检测结果:不存在死锁!\n);printf(安全序列为:);for(i=0;iM;i++)printf(%d\t,que[i]);printf(\n);return0;}/***************主函数***************/voidmain(){intm=0,n=0,i=0,j=0;printf(\t\t\t死锁的检测与解除\n);printf(\n);input();output();//enter1://{printf(请输入请求资源的进程号:);scanf(%d,&n);printf(\n);//if(n0||n=M)//{//printf(您输入的进程号不存在,请重新输入!\n);//gotoenter1;//}//}//enter2://{printf(请输入进程%d对3类资源的需求量:,n);for(j=0;j3;j++){scanf(%d,&request[j]);//if(request[j]need[n][j])//{//printf(申请的资源数量大于自身需求的最大值!请重新输入!\n);//gotoenter2;//}//else//{//if(request[j]available[j])//{//printf(申请的资源数量大于可用的资源数量!请重新输入!\n);//gotoenter2;//}//}}//}printf(\n);change(n);if(checksafe(n)){check
本文标题:操作系统实验报告-死锁的检测与解除
链接地址:https://www.777doc.com/doc-7267308 .html