实验三死锁的检测和解除之欧阳计创编
南华大学计算机科学与技
术学院
时间:2021.02.11 创作:欧阳计 实验报告
课程名称 操作系统I 姓 名 学 号 专业班级 任课教师 日
期
欧阳计创编 2021..02.11
欧阳计创编 2021..02.11
一、 实验内容
死锁的检测与解除
二、 实验目的
掌握操作系统的进程管理与资源分配原理,掌握对操作系统安全性检验和死锁的解除的原理和方法。
三、 实验题目
系统中有 m 个同类资源被 n 个进程共享,每个进程对资源的最大需求数分别为 S1,S2,…,Sn,且 Max(Si)<=m, (i=1,2,…n)。进程可以动态地申请资源和释放资源。编写一个程序,实现银行家算法,当系统将资源分配给某一进程而不会死锁时,就分配之。否则,推迟分配,并显示适当的信息。
分别使用检测“进程—资源循环等待链”的方法和 Coffman 的算法来检测进程的死锁状态。对于相同的进程资源分配、占用次序,比较两个算法的结果。
四、设计思路和流程图
1.输入系统进程数量n和资源类型数量m。 2.输入每类资源的数量。
3.输入每个进程每类资源的最大需求量和已获资源量。 4.检验系统的安全。
5.若检测结果为系统不安全,可以对死锁进行解除,直到安全为止再检测。 6.重复5操作,直到所有进程运行完毕。
欧阳计创编 2021..02.11
欧阳计创编 2021..02.11
五、 主要数据结构及其说明
欧阳计创编 2021..02.11
欧阳计创编 2021..02.11
int Max[100][100]={0}; //各进程所需各类资源的最大需求; int Available[100]={0}; //系统可用资源; char Name[100]={0}; //资源的名称;
int Allocation[100][100]={0}; //系统已分配资源; int Need[100][100]={0}; //还需要资源 int Request[100]={0}; //请求资源向量; int Temp[100]={0}; //存放安全序列;
int Work[100]={0}; //存放系统可提供资源; bool Finish[100]={0};//存放已完成的序列
六、 源程序并附上注释
#include \"stdafx.h\" #include using namespace std; int Max[100][100]={0}; //各进程所需各类资源的最大需求; int Available[100]={0}; //系统可用资源; char Name[100]={0}; //资源的名称; int Allocation[100][100]={0}; //系统已分配资源; int Need[100][100]={0}; //还需要资源 int Request[100]={0}; //请求资源向量; int Temp[100]={0}; //存放安全序列; int Work[100]={0}; //存放系统可提供资源; bool Finish[100]={0}; int M=100; //作业的最大数 int N=100; //资源的最大数 int l=0;//记录安全进程的TEMP下标 void ShowData()//初始化资源矩阵 { int i,j; cout<<\"系统可用资源[Available]:\"< for (i=0;i 欧阳计创编 2021..02.11 } cout<<\" \"; } cout< int i,j,k; for(i=0;i for(i=0;i continue; } else { for(j=0;j break; } } if(j==N)//若Need都小于Work { Finish[i]=true; for(k=0;k 欧阳计创编 2021..02.11 Work[k]+=Allocation[i][k]; //进程i执行完后回收资源 } Temp[l++]=i; i=-1; } else { continue; } } if(l==M) { cout<<\"系统是安全的\"< cout<<\"\"< cout<<\"会发生死锁,发生死锁的进程是:\"<void unlock() { int i,j; i=0; cout<<\"死锁解除开始\"; cout< 欧阳计创编 2021..02.11 欧阳计创编 2021..02.11 } if(Safe()) cout<<\"死锁已解除\"< int main(){ int i,j,number,m,n,flag; int over; char mc; cout<<\"--------------------------死锁的检测与解除----------------------------------\"; cout< for (i=0;i cout<<\"资源\"<>number; Available[i]=number; cout< cout<<\"请输入各进程的最大需求量(\"< flag=0; cout<<\"请输入各进程已经分配资源量(\"< 欧阳计创编 2021..02.11 { cin>>Allocation[i][j]; if(Allocation[i][j]>Max[i][j]) flag=1; Need[i][j]=Max[i][j]-Allocation[i][j]; } if(flag) cout<<\"首次输入的已分配资源已经大于最大需求量请重新输入!\\n\"; }while(flag);// 当申请资源符合要求时end do ShowData();//显示 Safe();//安全检测 if(l!=m)//当安全进程数不等于所有进程数 unlock(); cout<<\"运行结束\"< 七、 程序运行时的初值和运行结果 欧阳计创编 2021..02.11 欧阳计创编 2021..02.11 八、 实验体会 通过本次实验,比较完整的掌握了操作系统的进程管理与资源分配原理,以及对操作系统安全性检验和死锁的解除的原理和方法。一开始,对于死锁的解除,我只是从第一个进程开始剥夺其资源,也不管它是不是发生了死锁,一直剥夺到死锁解除为止。然后,通过对程序进行改进,让其可以判断死锁进程与非死锁进程,然后从第一个死锁进程开始剥夺已分配资源。到最后,又进一步完善程序,让其判断一下在死锁进程中,哪个的已分配资源最多,就先剥夺它的资源,直到死锁解除。通过以上这几次对程序的改进,我不仅对死锁的解除有了更进一步的理解,也加深了对编程理念的认识。一种好的编程习惯、编程理念不仅可以帮助减少工作量,更可以帮助编程人员对程序的思想进行全面理解,对程序需求进行全面理解。 时间:2021.02.11 欧阳计创编 2021..02.11 创作:欧阳计 因篇幅问题不能全部显示,请点此查看更多更全内容