1.实验目的
(1)使学生加深对死锁的理解,理解预防死锁的思想和方法,使学生明确系统安全状态的概念。
(2)使学生能利用银行家调度算法实现避免死锁。 2.实验预备内容
阅读死锁的基本概念,产生死锁的原因、产生死锁的必要条件以及处理死锁的基本方法,重点阅读关于死锁避免的章节。 3.实验环境
(1)一台运行Windows 2000 professional操作系统的计算机。
(2)选用turbo c、visual c++、delphi、c++ builder或visual basic等任何一种语言,建议用c++。 4.实验时间:
4个机时。
5.实验内容
(1)设置银行家算法中的数据结构 (a)可利用资源向量Available
它是一个含有m个元素的数组,其中的每一个元素代表一类可利用资源的数目,其初始值是系统中所配置该类全部可用资源数目。其数值随该类资源的分配和回收而动态地改变。
如果Available[j]=k表示系统中现有
类资源k个。
(b)最大需求矩阵Max 这是一个的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。
如果Max(i,j)=k,表示进程i需要
类资源的最大数目为k。
(c)分配矩阵Allocation 这是一个的矩阵,它定义了系统中每一类资源当前已分配该每一进程的资源数。
如果Allocation(i,j)=k,表示进程i当前已分得
类资源的数目为k。
(d)分配矩阵Need 这是一个的矩阵,用以表示每一个进程尚需的各类资源数。 如果Need(i,j)=k表示进程i还需要
类资源k个,方能完成其任务。
上述三个矩阵存在如下关系:
Need(i,j)=Max(i,j)-Allocation(i,j)
(2)银行家算法 设类的资源。当
① 如果
已超过它所宣布的最大值。
② 如果必须等待。
③系统试探把要求的资源分配给进程
Available
,并修改下面数据结构中的数值: Available-
; ; ;
④系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程状态,让进程
,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配
,则转向步骤③;否则,表示系统中尚无足够的的资源,
是进程
的请求向量。如果
[j]=k,表示进程
需要k个
发出资源请求后,系统按下述步骤进行检查:
,则转向步骤②;否则,认为出错,因为它所需要的资源数
等待。
(3)安全性算法
系统所执行的安全性算法描述如下: ①设置两个向量
(a)工作向量Work。它表示系统可提供给进程继续运行所需要的各类资源数目,它含有m个元素,执行安全算法开始时,Work:=Available。
(b)Finish。它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i] :=false;当有足够资源分配给进程时,令 Finish[i] :=true。
②从进程集合中找到一个能满足下列条件的进程: (a) Finish[i]:=false
(b)
如找到,执行步骤③;否则执行步骤④。 ③当进程
获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执
行:
Work:=Work+Allocationi; Finish[i]:=true; go to step (2)
④如果所有进程的Finish[i]:=true,则表示系统处于安全状态;否则,系统处于不安全
状态。 6.参考算法
#include #define MAX_PROCESS 32 //最大进程数 #define MAX_COURCE //最大资源类别 int MAX_FACT_PROCESS; //实际总进程数 int MAX_FACT_COURCE; //实际资源类别数 int Available[MAX_COURCE]; //可利用资源向量 int Max[MAX_PROCESS][MAX_COURCE]; //最大需求矩阵 int Allocation[MAX_PROCESS][MAX_COURCE]; //分配矩阵 int Need[MAX_PROCESS][MAX_COURCE]; //需求矩阵 int Request_PROCESS; //发出请求的进程 int Request_COURCE; //被请求资源类别 int Request_COURCE_NEMBER; //请求资源数 struct COMP{ int value; int num; int next; }; int flag=0; void Read_Initiate(void){ //读入初始化文档 ifstream infile(\"Initiate.txt\"); if(!infile){ cout<<\"不能打开输入文件:\"<<\"Initiate.txt\"<<'\\n'; exit(1); } cout<<\"开始读入初始化文档\"<<'\\n'; int ch; int Array[MAX_PROCESS*MAX_COURCE*2]; int num=0; while(infile>>ch) Array[num++]=ch; num=0; MAX_FACT_COURCE=Array[num++]; for(int j=0;j for(int i=0;i void Write_Initiate(void){ //写入初始化文档(分配资源 ofstream outfile(\"Initiate.txt\"); if(!outfile){ cout<<\"不能打开初始化文档:\"<<'\\n'; exit(1); } int Array[MAX_PROCESS*MAX_COURCE*2]; int num=0; Array[num++]=MAX_FACT_COURCE; for(int i=0;i cout<<\"修改初始化文档成功!\"< cout<<\"不能打开输入文件:\"<<\"Allocated_list.txt\"<<'\\n'; exit(1); } cout<<\"开始读入已分配资源列表\"<<'\\n'; int ch,num=0; int Array[MAX_PROCESS*MAX_COURCE]; while(infile>>ch) Array[num++]=ch; num=0; for(int i=0;i for(int i=0;i cout<<\"不能打开输入文件:\"<<\"Request_list.txt\"<<'\\n'; exit(1); } cout<<\"开始读入请求向量\"<<'\\n'; int Array[3]; int num=0,ch; while(infile>>ch) Array[num++]=ch; Request_PROCESS=Array[0]; Request_COURCE=Array[1]; Request_COURCE_NEMBER=Array[2]; infile.close(); } void Write_Allocation(void){ //修改资源分配列表(资源分配) ofstream outfile(\"Allocated_list.txt\"); if(!outfile){ cout<<\"不能打开资源分配列表:\"<<'\\n'; exit(1); } for(int i=0;i cout<<\"修改资源分配列表成功!\"< for(i=0;i t=Array[j].value; Array[j].value=Array[i].value; Array[i].value=t; t=Array[j].num; Array[j].num=Array[i].num; Array[i].num=t; } else continue; } DWORD m_delay=3000; Sleep(m_delay); /*for(i=0;i Work[Request_COURCE-1]=Work[Request_COURCE-1]+Allocation[Request_PROCESS-1][Request_COURCE-1]; Finish[Request_PROCESS-1][Request_COURCE-1]=true; } else { cout<<\"未通过安全性测试,不与以分配\"< Work[Request_COURCE-1]=Work[Request_COURCE-1]+Allocation[Array[i].num][Request_COURCE-1]; Finish[Array[i].num][Request_COURCE-1]=true; } } for(i=0;i cout<<\"未通过安全性测试,不与以分配\"< cout<<\"P\"< cout<<'\\n'<<\"已通过安全性测试!\"< cout<<\"*************************************************\"<<'\\n'<<\"点击1执行!\" <<'\\n'<<\"点击2退出!\" <<'\\n'<<\"*************************************************\"< cout<<\"开始扫描请求信息!\"< cout<<'\\n'<<\"第\"< cout<<'\\n'<<\"第\"< Allocation[Request_PROCESS-1][Request_COURCE-1]=Allocation[Request_PROCESS-1][Request_COURCE-1]+Request_COURCE_NEMBER; Need[Request_PROCESS-1][Request_COURCE-1]=Need[Request_PROCESS-1][Request_COURCE-1]-Request_COURCE_NEMBER; cout<<\"扫描通过\"< cout<<\"输入错误,请重新输入!\"<<'\\n'; RUN(); } } void main(void){ Read_Initiate(); cout< for(i=0;i for(i=0;i cout<<'\\n'<<\"第\"< 3 3 3 2 //共有3类资源,Available[0]=3; Available[1]=3; Available[2]=2 5 //当前系统中有个进程 7 5 3 // Max[0][0]=7 3 2 2 //Max[1][1]=3 9 0 2 2 2 2 4 3 3 2.Allocated_list.txt文本 0 1 0 //Allocation[0][1]=1 2 0 0 3 0 2 2 1 1 0 0 2 3.Request_list.txt文本 2 1 1 //第2个进程请求第1类资源1个Request[1][0]=1 本程序假设当前时刻只有一个进程请求某一类资源n个. 若要满足某个进程当前时刻同时请求不止一类资源,则需要为最大需求矩阵Max,分配矩阵Allocation和需求矩阵Need增加维数,当然代码量也将大大增加,但是算法逻辑本身并无变化. 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo6.com 版权所有 湘ICP备2023023988号-11
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务