死锁避免实验

  • 格式:doc
  • 大小:8.04 MB
  • 文档页数:17

沈 阳 工 程 学 院 学 生 实 验 报 告

(课程名称:计算机操作系统 )

实验题目:死锁避免实验

班 级 计算机 学 号 19 姓 名 地 点 指导教师 实 验 日 期 : 2014 年 月 日 1

一、实验目的 多个进程动态地共享系统的资源时可能会产生死锁现象。银行家算法是通过对资源的分配进行动态地检查来达到避免死锁的目的。本实验通过模拟银行家算法的应用,使读者了解银行家算法的执行过程。从而进一步理解死锁产生的条件和避免死锁问题产生的方法。 二、实验环境

VC++ 三、实验内容与要求 编写一段程序模拟银行家算法 ⑴死锁的产生必须同时满足4个条件: ● 互斥条件,即一个资源每次只能由一个进程占用。 ● 请求与保持条件,即一进程请求资源不能满足时,它必须等待,同时它仍保持已得到的所有其它资源。 ● 不可剥夺条件,任何一个进程不能抢占另一个进程已经获得且未释放的资源。 ● 环路等待条件,系统进入死锁的状态时,进程和资源之间形成一个封闭的环路。 ⑵银行家算法是一种具有代表性的避免死锁的算法。银行家算法为资源分配定义了两种状态,安全状态和不安全状态。 ● 安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统

处于安全状态。处于安全状态的系统一定没有死锁发生。 ● 不安全状态:当系统中不存在一个安全序列时系统处于不安全状态。不安全状态下一定导致死锁发生。

四、实验过程及结果分析 实验代码如下: // BB.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include #include #define False 0 2

#define True 1 int Max[100][100]={0};//各进程所需各类资源的最大需求 int Avaliable[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};//存放系统可提供资源 int M=100;//作业的最大数为100 int N=100;//资源的最大数为100 void showdata()//显示资源矩阵 { int i,j; cout<<"系统目前可用的资源[Avaliable]:"

cout

return 1; } int safe()//安全性算法

{ int i,k=0,m,apply,Finish[100]={0}; int j; int flag=0; Work[0]=Avaliable[0]; Work[1]=Avaliable[1]; Work[2]=Avaliable[2]; for(i=0;iapply=0; for(j=0;jif (Finish[i]==False&&Need[i][j]<=Work[j]){ apply++; if(apply==N){ for(m=0;mWork[m]=Work[m]+Allocation[i][m];//变分配数 Finish[i]=True; temp[k]=i; i=-1; k++; flag++; } 5

} } } for(i=0;iif(Finish[i]==False){ cout<<"系统不安全"

{ char ch; int i=0,j=0; ch='y'; cout<<"请输入要求分配的资源进程号(0-"<6

cin>>i;//输入须申请的资源号 cout<<"请输入进程">Request[j];//输入需要申请的资源 }

for (j=0;jif(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错 { cout<<"进程"Avaliable[j])//判断申请是否大于当前资源,若大于则 { //出错 cout<<"进程"

} } if(ch=='y') { changdata(i);//根据进程需求量变换资源 showdata();//根据进程需求量显示变换后的资源 safe();//根据进程需求量进行银行家算法判断 } } void addresources(){//添加资源 int n,flag; cout<<"请输入需要添加资源种类的数量:"; cin>>n; flag=N; N=N+n; for(int i=0;icout<<"名称:"; cin>>name[flag]; cout<<"数量:"; cin>>Avaliable[flag++]; } showdata(); safe(); } void delresources(){//删除资源 char ming; 8

int i,flag=1; cout<<"请输入需要删除的资源名称:"; do{ cin>>ming; for(i=0;iif(ming==name[i]){ flag=0; break; } if(i==N) cout<<"该资源名称不存在,请重新输入:"; } while(flag); for(int j=i;j{ name[j]=name[j+1]; Avaliable[j]=Avaliable[j+1]; } N=N-1; showdata(); safe(); } void changeresources(){//修改资源函数 cout<<"系统目前可用的资源[Avaliable]:"