您的当前位置:首页正文

实验三死锁的检测和解除之欧阳计创编

来源:要发发知识网
欧阳计创编 2021..02.11

南华大学计算机科学与技

术学院

时间: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 #define False 0 #define True 1

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]:\"<cout<for(j=0;jcout<cout<<\" Max Allocation Need\"<for (j=0;j<3;j++)//MAX ALLOCATION NEED 共列 {

for (i=0;icout<欧阳计创编 2021..02.11

欧阳计创编 2021..02.11

}

cout<<\" \"; } cout<cout<<\" \"<cout<cout<cout<bool Safe() //安全性算法 {

int i,j,k;

for(i=0;iWork[i]=Available[i]; //初始化工作向量 for(i=0;iFinish[i]=false; //判断进程i是否已执行 }

for(i=0;iif(Finish[i]==true) {

continue; } else {

for(j=0;jif(Need[i][j]>Work[j]) {

break; } }

if(j==N)//若Need都小于Work {

Finish[i]=true; for(k=0;k欧阳计创编 2021..02.11

欧阳计创编 2021..02.11

Work[k]+=Allocation[i][k]; //进程i执行完后回收资源

}

Temp[l++]=i; i=-1; } else {

continue; } }

if(l==M) {

cout<<\"系统是安全的\"<cout<cout<<\"-->\"; } }

cout<<\"\"<for(i=0;iif(Finish[i]==false)

cout<<\"会发生死锁,发生死锁的进程是:\"<void unlock() {

int i,j; i=0;

cout<<\"死锁解除开始\"; cout<while(ifor(j=0;jAvailable[j]+=Allocation[i][j]; //回收该进程所有资源 Allocation[i][j]=0;

欧阳计创编 2021..02.11

欧阳计创编 2021..02.11

}

if(Safe())

cout<<\"死锁已解除\"<i++;//到下一个进程 Safe(); } }

int main(){

int i,j,number,m,n,flag; int over; char mc;

cout<<\"--------------------------死锁的检测与解除----------------------------------\"; cout<cout<<\"输入当前系统可供使用资源种类的数量:\"; cin>>n; N=n;

for (i=0;icout<<\"资源\"<>mc; Name[i]=mc;

cout<<\"资源\"<>number;

Available[i]=number; cout<cout<cout<<\"请输入作业的数量:\"; cin>>m; M=m;

cout<<\"请输入各进程的最大需求量(\"<>Max[i][j]; } do{

flag=0;

cout<<\"请输入各进程已经分配资源量(\"<阵)[Allocation]:\"<for (int i=0;i欧阳计创编 2021..02.11

欧阳计创编 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<<\"运行结束\"<>over; }

七、 程序运行时的初值和运行结果

欧阳计创编 2021..02.11

欧阳计创编 2021..02.11

八、 实验体会

通过本次实验,比较完整的掌握了操作系统的进程管理与资源分配原理,以及对操作系统安全性检验和死锁的解除的原理和方法。一开始,对于死锁的解除,我只是从第一个进程开始剥夺其资源,也不管它是不是发生了死锁,一直剥夺到死锁解除为止。然后,通过对程序进行改进,让其可以判断死锁进程与非死锁进程,然后从第一个死锁进程开始剥夺已分配资源。到最后,又进一步完善程序,让其判断一下在死锁进程中,哪个的已分配资源最多,就先剥夺它的资源,直到死锁解除。通过以上这几次对程序的改进,我不仅对死锁的解除有了更进一步的理解,也加深了对编程理念的认识。一种好的编程习惯、编程理念不仅可以帮助减少工作量,更可以帮助编程人员对程序的思想进行全面理解,对程序需求进行全面理解。

时间:2021.02.11 欧阳计创编 2021..02.11

创作:欧阳计

因篇幅问题不能全部显示,请点此查看更多更全内容