死锁避免算法设计报告

合集下载

操作系统实验报告-死锁的避免

操作系统实验报告-死锁的避免

操作系统实验报告-死锁的避免操作系统实验(二)死锁的避免1.实验内容使用C++实现模拟随机算法和银行家算法2.实验目的(1)了解死锁的产生原因(随机算法)(2)理解死锁的解决办法(银行家算法)3.实验题目使用随机算法和银行家算法设计程序4.程序流程图主要过程流程图银行家算法流程图安全性算法流程图5.程序代码和运行结果#include <stdio.h>#include<stdlib.h> typedef struct{int A;int B;int C;}RES;#define false 0#define true 1//系统中所有进程数量#define PNUMBER 3//最大需求矩阵RES Max[PNUMBER];//已分配资源数矩阵RES Allocation[PNUMBER];//需求矩阵RES Need[PNUMBER];//可用资源向量RES Available={0,0,0};//安全序列int safe[PNUMBER];void setConfig(){int i=0,j=0;printf("================开始手动配置资源==================\n");//可分配资源printf("输入可分配资源\n");scanf("%d%d%d",&Available.A,&Available.B,&Available.C);//最大需求矩阵MAXprintf("输入最大需求矩阵%dx%d\n",PNUMBER,PNUMBER );for (i=0;i<PNUMBER;i++){scanf("%d%d%d",&Max[i].A,&Max[i].B,&Max[i].C);}//已分配矩阵Allocprintf("输入已分配矩阵%dx%d\n",PNUMBER,PNUMBER);for (i=0;i<PNUMBER;i++){scanf("%d%d%d",&Allocation[i].A,&Allocation[i].B,&Allocation[i].C);}//需求矩阵printf("输入需求矩阵%dx%d\n",PNUMBER,PNUMBER);for (i=0;i<PNUMBER;i++){scanf("%d%d%d",&Need[i].A,&Need[i].B,&Need[i].C);}printf("================结束配置资源==================\n");}void loadConfig(){FILE *fp1;if ((fp1=fopen("config.txt","r"))==NULL){printf("没有发现配置文件,请手动输入\n");setConfig();}else{int i=0;printf("发现配置文件,开始导入..\n");//可分配资源fscanf(fp1,"%d%d%d",&Available.A,&Available.B,&Available.C);//最大需求矩阵MAXfor (i=0;i<PNUMBER;i++){fscanf(fp1,"%d%d%d",&Max[i].A,&Max[i].B,&Max[i].C);}//已分配矩阵Allocfor (i=0;i<PNUMBER;i++){fscanf(fp1,"%d%d%d",&Allocation[i].A,&Allocation[i].B,&Allocation[i].C);}//需求矩阵for (i=0;i<PNUMBER;i++){fscanf(fp1,"%d%d%d",&Need[i].A,&Need[i].B,&Need[i].C);}}}//试探分配void ProbeAlloc(int process,RES *res){Available.A -= res->A;Available.B -= res->B;Available.C -= res->C;Allocation[process].A += res->A;Allocation[process].B += res->B;Allocation[process].C += res->C;Need[process].A -= res->A;Need[process].B -= res->B;Need[process].C -= res->C;}//若试探分配后进入不安全状态,将分配回滚void RollBack(int process,RES *res){Available.A += res->A;Available.B += res->B;Available.C += res->C;Allocation[process].A -= res->A;Allocation[process].B -= res->B;Allocation[process].C -= res->C;Need[process].A += res->A;Need[process].B += res->B;Need[process].C += res->C;}//安全性检查bool SafeCheck(){RES Work;Work.A = Available.A;Work.B = Available.B;Work.C = Available.C;bool Finish[PNUMBER] = {false,false,false};int i;int j = 0;for (i = 0; i < PNUMBER; i++){//是否已检查过if(Finish[i] == false){//是否有足够的资源分配给该进程if(Need[i].A <= Work.A && Need[i].B <= Work.B && Need[i].C <= Work.C){//有则使其执行完成,并将已分配给该进程的资源全部回收Work.A += Allocation[i].A;Work.B += Allocation[i].B;Work.C += Allocation[i].C;Finish[i] = true;safe[j++] = i;i = -1; //重新进行遍历}}}//如果所有进程的Finish向量都为true则处于安全状态,否则为不安全状态for (i = 0; i < PNUMBER; i++){if (Finish[i] == false){return false;}}return true;}//资源分配请求bool request(int process,RES *res){//request向量需小于Need矩阵中对应的向量if(res->A <= Need[process].A && res->B <= Need[process].B && res->C <=Need[process].C){//request向量需小于Available向量if(res->A <= Available.A && res->B <= Available.B && res->C <= Available.C){//试探分配ProbeAlloc(process,res);//如果安全检查成立,则请求成功,否则将分配回滚并返回失败if(SafeCheck()){return true;}else{printf("安全性检查失败。

操作系统实验报告 预防进程死锁的银行家算法

操作系统实验报告 预防进程死锁的银行家算法

操作系统实验预防进程死锁的银行家算法一、需求分析:1、实验目的:通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。

2、问题描述:设计程序模拟预防进程死锁的银行家算法的工作过程。

假设系统中有n个进程P1, … ,P n,有m类可分配的资源R1, … ,R m,在T0时刻,进程P i分配到的j类资源为Allocation ij个,它还需要j类资源Need ij个,系统目前剩余j类资源Work j个,现采用银行家算法进行进程资源分配预防死锁的发生。

3、程序要求:1)判断当前状态是否安全,如果安全给出安全序列;如果不安全给出理由。

2)对于下一个时刻T1,某个进程P k会提出请求Request(R1, … ,R m),判断分配给P k进程请求的资源之后系统是否安全。

3)输入:进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置);4)输出:如果安全,输出安全的进程序列,不安全则提示信息。

二、概要设计:1、进程调度的实现过程2、程序中的变量及数据结构struct ResItem{string Name;int Number;}; //资源项typedef vector<ResItem> Resource;struct Progress{string Name;Resource Max; //最大需求Resource Allocation; //分配Resource Need; //需求}; //进程vector <Progress> Progresses; //所有进程vector <ResItem> Available; //可利用资源向量vector <Progress> SafeOrder; //安全序列3、主要函数//初始化数据void InitData(int &n);//判断rs1是否小于等于rs2,是返回true,否则返回falseinline bool LessThan(Resource rs1,Resource rs2);//安全性算法bool SafeAlg();//银行家算法bool BankerAlg(Resource request,Progress &pro);4、主函数int main(){int n;InitData(n);cout<<"\n\n=============================================\n ";if(SafeAlg()){cout<<"由安全性检查可知:可以找到一个安全序列为:{";for(int i = 0 ; i < SafeOrder.size(); i++)cout<<SafeOrder[i].Name<<",";cout<<"}。

操作系统银行家算法(避免死锁)实验报告

操作系统银行家算法(避免死锁)实验报告

操作系统实验:银行家算法姓名:李天玮班级:软工1101 学号:201126630117 实验内容:在windows系统中实现银行家算法程序。

实现银行家算法所用的数据结构:假设有5个进程3类资源,则有如下数据结构:1.MAX[5,3] 5个进程对3类资源的最大需求量。

2.A V AILABLE[3]系统可用资源数。

3.ALLOCATION[5,3]5个进程已经得到3类资源的资源量。

4.NEED[5,3]5个进程还需要3类资源的资源量。

银行家算法:设进程1提出请求Request[N],则银行家算法按如下规则进行判断。

(1)如果Request[N]<=NEED[1,N],则转(2);否则,出错。

(2)如果Request[N]<=A V ALIABLE,则转(3);否则,出错。

(3)系统试探非配资源,修改相关数据。

A V ALIABLE=A V ALIABLE-REQUESTALLOCATION=ALLOCA TION+REQUESTNEED=NEED-REQUEST(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

安全性检查:(1)设置两个工作向量WORK=A V AILABLE;FINISH[M]=FALSE.(2)从晋城集合中找到一个满足下述条件的进程,FINISH[i]=FALSENEED<=WORK如找到,执行(3);否则,执行(4)。

(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

WORK=WORK+ALLOCATIONFINISH[i]=TRUEGOTO(2)(4)如所有进程FINISH[M]=TRUE,则表示安全;否则系统不安全。

1.用init()函数对于数据的初始化关键代码:#define M 5#define N 3void init(){cout<<"请输入5个进程对3类资源最大资源需求量:"<<endl;for(int i=0;i<M;i++){for(int j=0;j<N;j++){cin>>MAX[i][j];}//cout<<endl;}cout<<"请输入系统可用的资哩源数:"<<endl;for(int j=0;j<N;j++){cin>>AVAILABLE[j];}cout<<"请输入5个进程已经-的到的3类资源的资源量:"<<endl;for(int i=0;i<M;i++){for(int j=0;j<N;j++){cin>>ALLOCATION[i][j];}//cout<<endl;}cout<<"请?输?入?5个?进?程ì还1需è要癮3类え?资哩?源′的?资哩?源′量?:"<<endl;for(int i=0;i<M;i++){for(int j=0;j<N;j++){cin>>NEED[i][j];}//cout<<endl;}}// Stack around the variable 'AVAILABLE' was corrupted.显示数据详细信息进行测试输入一号进程号,并给需要申请资源设定为{1,0,2}检验错误输入时候的报错信息检验当再次申请0号资源并申请资源数目为{0,2,0}时,系统提示系统不安全申请不成功。

实验报告(死锁的避免)

实验报告(死锁的避免)
允许进程动态地申请资源和释放资源,系统按进程的申请动态地分配资源。程序能够在进程提出资源申请后判断系统是否处于安全状态,如果安全则打印资源分配表和安全序列;如果不安全则输出不能分配的提示。
三、程序设计和说明
1.算法描述
2.算法实现
四、实课程实验报告
实验名称:死锁的避免
姓名:
学号:
专业:
五邑大学计算机学院
一、实验目的
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
二、实验内容
编写一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法有效地避免死锁的发生。实验要求设计一个有三类资源A、B、C的系统,它们的资源总量分别为10、5、7,资源由五个进程p0、p1、p2、p3、p4共享。假设当前的资源分配状态为:

实验五 死锁避免的算法

实验五  死锁避免的算法

实验五 死锁避免的算法【实验目的】1、 了解死锁避免的原理。

2、 研究银行家算法的实现方法。

【实验内容】编程实现银行家算法。

【实验报告】1、 列出调试通过程序的清单,并附上文档说明。

2、 总结上机调试过程中所遇到的问题和解决方法及感想。

【实验相关资料】一、死锁概念多个并发进程,每个进程占有部分资源,又都等待其它进程释放所占资源,造成均不能向前推进的现象。

二、死锁的避免死锁避免原理就是使系统始终处于安全状态。

安全状态:所谓安全状态是指能够找到一个安全序列,系统能够按照这个安全序列依次为进程分配资源,使所有进程都能执行完毕,如果找不到这样的安全序列,系统就处于不安全状态。

三、银行家算法银行家算法要求每个进程的最大资源需求,其基本思想是:始终保持系统处于安全状态,当进程提出资源请求时,系统先进行预分配,再判断系统分配后是否仍然处于安全状态。

如果仍然处于安全状态,就进行实际分配;如果处于不安全状态,则拒绝该进程的资源请求。

四、银行家算法相关数据结构1. 最大需求矩阵:d (t)=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⋅⋅⋅⋅nm n n m m d d d d d d d d d .........212222111211 其中,行表示进程,列表示资源,如:d ij =5表示第 i 个进程最多需要j 类资源5个。

2. 资源分配矩阵:a(t)=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⋅⋅⋅⋅nm n n m m a a a a a a a a a .........212222111211 元素a ij =8表示分配给第 i 进程8个j 类资源。

3. 需求矩阵:b(t)=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⋅⋅⋅⋅nm n n m m b b b b b b b b b .........212222111211 元素b ij =3表示第i 类进程还需要3个j 类资源。

最大需求矩阵=分配矩阵+需求矩阵,即d(t)=a(t)+b(t)。

死锁避免实验报告

死锁避免实验报告

“死锁避免”实验报告实验思路:先定义进程控制块的数据结构pcb,确定进程并发数目SIZE,在初始化进程时,保证各进程最大资源申请量不大于系统的资源总量,如果大于,则重新输入。

初始化完成之后,选择相应的死锁避免的算法,或随机分配算法,或银行家算法。

随机分配方法:运用取余的方法,轮询各个进程,选择处于就绪状态的进程之一,然后输入该进程的当前资源申请量apply,判断该申请量是否大于系统当前资源剩余量,若大于,将就绪进程状态设置为阻塞态,然后查找就绪队列中是否还有就绪进程,若有,则选择一个就绪进程,继续执行,若没有就绪进程,则表示发生死锁。

若不大于,则给满足该进程的申请量,并将其自愿申请量的变量设为0。

接着再进行判断该进程是否得到全部所需资源,若没有,则选择就绪队列中一个就绪进程,若全部得到,归还该进程所占有的全部资源给系统,并将该进程设置为完成态。

此时,再进行检查有无等待态的进程,若没有,则选择就绪队列中一个就绪进程,若有,则顺序检查等待进程,判断系统现有资源能满足某一等待进程,若能,则将该等待进程状态设置为就绪态,若没有,查找就绪队列中是否还有就绪进程,若有,则选择一个就绪进程,继续执行,若没有就绪进程,则表示发生死锁。

银行家算法:运用取余的方法,轮询各个进程,选择处于就绪状态的进程之一,然后输入该进程的当前资源申请量apply,判断该申请量是否大于系统当前资源剩余量,若大于,将就绪进程状态设置为阻塞态,然后查找就绪队列中是否还有就绪进程,若有,则选择一个就绪进程,继续执行,若没有就绪进程,则表示发生死锁。

若不大于,则假定满足该进程的申请量,并将其资源申请量的变量设为0,表示系统资源的变量减少相应的该进程的资源申请量,然后系统资源暂时用一个变量current保存起来。

将分配后系统剩余的资源数量与各进程的剩余需求量比较寻找一个系统能满足其需求的进程,每找一次,都要计数,用num变量,若找到,在标记数组a[SIZE]中进行相应标记,同时没找到一个都要进行一次对标记数组的循环测试,若测试到所有项都进行了标记,则退出循环,说明此次分配是安全的,若找不到,测试num的值,(对于确定数目的并发进程,其最大分配安全的循环次数<=SIZE!)。

模拟银行家算法实现死锁避免课程设计报告-25页文档资料

模拟银行家算法实现死锁避免课程设计报告-25页文档资料

《操作系统》课程设计报告院系:计算机与信息工程学院题目:模拟银行家算法实现死锁避免评分表:目录题目:模拟银行家算法实现死锁避免 (1)评分表: (1)一课程设计目的 (3)二课程设计内容 (3)三课程设计环境 (4)四课程设计步骤 (5)41.需求分析 (5)4.1.1 问题的提出 (5)4.1.2 银行家算法原理 (5)4.1.3银行家算法详细解析 (6)4.1.4 银行安全性算法目的 (6)4.2概要设计 (7)4.2.1 功能模块设计如下: (7)4.2.2 功能模块描述 (7)4.3详细设计 (7)4.3.1基本数据结构的设计 (7)4.3.2算法的设计 (8)五课程设计结果 (9)5.1运行结果 (9)5.2测试分析 (9)六课程设计心得与体会 (9)总结 (9)七参考文献 (10)八程序清单 (11)8.1 操作主界面代码: (11)8.2 功能实现代码: (13)一课程设计目的在熟练掌握死锁发生原理和解决死锁问题的基础上,利用一种程序设计语言模拟实现利用银行家算法实现死锁避免,一方面加深对原理的理解,另一方面提高学生通过编程根据已有原理解决实际问题的能力,为学生将来进行系统软件开发和针对实际问题提出高效的软件解决方案打下基础。

二课程设计内容模拟实现银行家算法对系统资源进行分配,以防止死锁的出现。

本课题肯定不可能实现对实际操作系统的资源管理,而是通过对模拟资源数据的处理,检测银行家算法在防止死锁出现的作用。

银行家算法描述:第一部分:银行家算法(扫描)1.如果Request<=Need,则转向2;否则,出错2.如果Request<=Available,则转向3,否则等待3.系统试探分配请求的资源给进程4.系统执行安全性算法第二部分:安全性算法1.设置两个向量(1).工作向量:Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)(2).Finish:表示系统是否有足够资源分配给进程(True:有;False:没有).初始化为False2.若Finish[i]=False&&Need<=Work,则执行3;否则执行4(i为资源类别)3.进程P获得第i类资源,则顺利执行直至完成,并释放资源:Work=Work+Allocation;Finish[i]=true;转2请充分理解以上银行家算法描述的核心思想。

死锁_银行家算法实验报告

死锁_银行家算法实验报告

实验目的银行家算法是避免死锁的一种重要方法。

通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法二、实验要求根据银行家算法的基本思想,编写和调试一个实现动态资源分配的模拟程序,并能够有效地防止和避免死锁的发生。

(1)设计思想说明设计银行家算法是为了避免死锁三、实验方法内容1.算法设计思路银行家算法又称“资源分配拒绝”法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。

这时系统将该进程从进程集合中将其清除。

此时系统中的资源就更多了。

反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他。

请进程等待2.算法流程图3.算法中用到的数据结构数据结构的说明1.可利用资源向量AVAILABLE。

这是一个含有M个元素的数组,其中的每一个元素代表一类可利用的资源数目,其3初始值是系统中所配置的该类全部可哦那个资源的数目,其数值随该类资源的分配和回收而动态的改变。

2.最大需求矩阵MAX。

这是一个M*N的矩阵,它定义了系统中N个进程中的每一个进程对M类资源的最大需求。

3.分配矩阵ALLOCATION。

这也是一个M*N的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。

4.需求矩阵NEED。

这也是一个M*N的矩阵,用以表示每一个进程尚需的各类资源数。

5.NEED[R,W]=MAX[R,W]-ALLOCATION[R,W]4.主要的常量变量#define W 10 //最大进程数W=10#define R 20 //最大资源总数R=20 int AVAILABLE[R]; //可利用资源向量int MAX[W][R]; //最大需求矩阵int ALLOCATION[W][R]; //分配矩阵int NEED[W][R]; //需求矩阵int Request[R]; //进程请求向量void changdata(int k);//进程请求资源数据改变int chksec(int s); //系统安全性的检测5.主要模块void inputdata()void showdata()void changdata(int k)void restoredata(int k) int chksec(int s)int chkmax(int s)四、实验代码#include<string.h>#include<iostream.h>#define FALSE 0#define TRUE 1#define W 10 //最大进程数W=10#define R 20 //最大资源总数R=20int M ;int N ;int ALL_RESOURCE[W];int AVAILABLE[R]; //可利用资源向量int MAX[W][R]; //最大需求矩阵int ALLOCATION[W][R]; //分配矩阵int NEED[W][R]; //需求矩阵int Request[R]; //进程请求向量void inputdata(); //数据输入void showdata(); //数据显示void changdata(int k);//进程请求资源数据改变void restoredata(int k); //数据恢复int chksec(int s); //系统安全性的检测int chkmax(int s); //检测最大需求void bank(); //检测分配的资源是否合理void main(){ int i,j;inputdata();for(i=0;i<M;i++){ j=chksec(i);if (j==0) break;}if (i>=M)cout<<"错误提示:经安全性检查发现,系统的初始状态不安全!!!\n"<<endl;else{ cout<<"提示:经安全性检查发现,系统的初始状态安全!"<<endl;bank();}}void inputdata(){ int i=0,j=0,p;cout<<"请输入总进程数:"<<endl;do{cin>>M;if (M>W) cout<<endl<<"总进程数超过了程序允许的最大进程数,请重新输入:"<<endl;}while (M>W);cout<<endl;cout<<"请输入资源的种类数:"<<endl;do {cin>>N;if (N>R)cout<<endl<<"资源的种类数超过了程序允许的最大资源种类数,请重新输入:"<<endl; }while (N>R);cout<<endl;cout<<"请依次输入各类资源的总数量,即设置向量all_resource:"<<endl;for(i=0;i<N;i++) cin>>ALL_RESOURCE[i];cout<<endl;cout<<"请依次输入各进程所需要的最大资源数量,即设置矩阵max:"<<endl;for (i=0;i<M;i++){for (j=0;j<N;j++){do { cin>>MAX[i][j];if (MAX[i][j]>ALL_RESOURCE[j])cout<<endl<<"该最大资源数量超过了声明的该资源总数,请重新输入:"<<endl; }while (MAX[i][j]>ALL_RESOURCE[j]);}}cout<<endl;cout<<"请依次输入各进程已经占据的各类资源数量,即设置矩阵allocation:"<<endl;for (i=0;i<M;i++){for (j=0;j<N;j++){do{ cin>>ALLOCATION[i][j];if (ALLOCATION[i][j]>MAX[i][j])cout<<endl<<"已占有的资源数量超过了声明的最大资源数量,请重新输入:"<<endl;}while (ALLOCATION[i][j]>MAX[i][j]);}}cout<<endl;for (i=0;i<M;i++)for(j=0;j<N;j++)NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];for (j=0;j<N;j++){ p=ALL_RESOURCE[j];for (i=0;i<M;i++){ p=p-ALLOCATION[i][j];AVAILABLE[j]=p;if(AVAILABLE[j]<0)AVAILABLE[j]=0;}}}void showdata(){ int i,j;cout<<"各种资源的总数量,即向量all_resource为:"<<endl;cout<<" ";for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<ALL_RESOURCE[j];cout<<endl<<endl;cout<<"当前系统中各类资源的可用数量,即向量available为:"<<endl; cout<<" ";for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<AVAILABLE[j];cout<<endl<<endl;cout<<"各进程还需要的资源数量,即矩阵need为:"<<endl<<endl;for (i=0;i<M;i++){ cout<<"进程P"<<i<<": ";for (j=0;j<N;j++)cout<<NEED[i][j]<<" ";cout<<endl;}cout<<endl;cout<<"各进程已经得到的资源量,即矩阵allocation为: "<<endl<<endl;for (i=0;i<M;i++){ cout<<"进程P"<<i<<": ";for (j=0;j<N;j++)cout<<ALLOCATION[i][j]<<" ";cout<<endl;} cout<<endl;}void changdata(int k){ int j;for (j=0;j<N;j++){AVAILABLE[j]=AVAILABLE[j]-Request[j];ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];NEED[k][j]=NEED[k][j]-Request[j];}}void restoredata(int k){int j;for (j=0;j<N;j++){ AVAILABLE[j]=AVAILABLE[j]+Request[j];ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];NEED[k][j]=NEED[k][j]+Request[j];}}int chksec(int s){int WORK,FINISH[W];int i,j,k=0;for(i=0;i<M;i++)FINISH[i]=FALSE;for(j=0;j<N;j++){ WORK=AVAILABLE[j];i=s;do{ if(FINISH[i]==FALSE&&NEED[i][j]<=WORK){WORK=WORK+ALLOCATION[i][j];FINISH[i]=TRUE;i=0;}else{ i++;}}while(i<M);for(i=0;i<M;i++)if(FINISH[i]==FALSE){ return 1;}} return 0;}int chkmax(int s){ int j,flag=0;for(j=0;j<N;j++){if (MAX[s][j]==ALLOCATION[s][j]){ flag=1;AVAILABLE[j]=AVAILABLE[j]+MAX[s][j];MAX[s][j]=0;}} return flag;}c{int i=0,j=0;char flag='Y';while(flag=='Y'||flag=='y'){i=-1;while(i<0||i>=M){ cout<<"请输入需申请资源的进程号(从P0到P"<<M-1<<",否则重新输入!):"; cout<<"p";cin>>i;if(i<0||i>=M)cout<<"输入的进程号不存在,重新输入!"<<endl;}cout<<"请输入进程P"<<i<<"申请的资源数:"<<endl;for (j=0;j<N;j++){ cout<<" 资源"<<j<<": ";cin>>Request[j];if(Request[j]>NEED[i][j]){ cout<<"进程P"<<i<<"申请的资源数大于进程P"<<i<<"还需要"<<j<<"类资源的资源量!";cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;flag='N';break;}else{ if(Request[j]>AVAILABLE[j]){ cout<<"进程P"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的资源量!";cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;flag='N';break;}}}if(flag=='Y'||flag=='y'){ changdata(i);if(chksec(i)){ cout<<endl;cout<<"该分配会导致系统不安全!!! 本次资源申请不成功,不予分配!!!"<<endl;cout<<endl;restoredata(i);}else{ cout<<endl;cout<<"经安全性检查,系统安全,本次分配成功,且资源分配状况如下所示:"<<endl;cout<<endl;showdata();if(chkmax(i)){cout<<"在资源分配成功之后,由于该进程所需的某些资源的最大需求量已经满足,"<<endl;cout<<"因此在进程结束后系统将回收这些资源!"<<endl;cout<<"在资源收回之后,各进程的资源需求和分配情况如下所示:"<<endl;showdata();}}}cout<<endl;cout<<" 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ";cin>>flag; }}五、实验结果1.执行结果2.结果分析银行家算法就是当接收到一个系统资源的分配后找到一个安全序列,使得进程间不会发生死锁,若发生死锁则让进程等待。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

漳州师范学院操作系统课程设计死锁避免算法设计姓名:学号:系别:专业:年级:指导教师:一、课程设计题目介绍(含设计目的)死锁避免算法设计是通过模拟实现银行家算法实现死锁避免目的:1、了解进程产生死锁的原因,了解为什么要进行死锁的避免。

2、掌握银行家算法的数据结构,了解算法的执行过程,加深对银行家算法的理解。

3、通过运用Dijkstra的银行家算法来避免多个进程运行中因争夺资源而造成僵局,即死锁要求:本课程设计可以实现教材3.6.3节中所描述的银行家避免死锁算法。

可自定义进程数目、资源类型和每种类型资源的数目;可输入每个进程对每种资源的最大需求、已经获得的数量;当某进程发起某种资源请求时,计算系统状态是否安全。

思想:操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。

当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。

若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配,从而达到死锁的避免。

二、总体设计(含系统的结构、原理框图或模块介绍等)1.系统的结构2.原理框图从主函数开始进入银行家算法系统,先调用初始化函数chushihua()分别输入Allocation[i][j],Max[i][j],All[y]并判断是否符合条件,在调用函数show(),输出当前状态Available,Max[i][j],Allocation[i][j],Need[i][j]。

然后调用安全性算法函数safe()判断在该时刻是否处于安全状态,并输出安全序列。

然后调用银行家算法函数bank()进行试分配后再调用安全性算法函数判断在该时刻是否处于安全状态,若不安全,则恢复试分配时改变的值。

三、详细设计(含主要的数据结构、程序流程图等)1.数据结构资源的总数量All[i]:是个含有i个元素的数组,其中的每一个元素代表一类资源的总数量。

如果All [i]=K,则表示系统中现有i类资源总数为K个。

可利用资源向量Available[i]:是个含有i 个元素的数组,其中的每一个元素代表一类可利用的资源数目。

如果Available[i]=K,则表示系统中现有i类资源K个。

最大需求矩阵Max[i][j]:这是一个i×j的矩阵,它定义了系统中i个进程的每一个进程对j类资源的最大需求。

如果Max[i][j]=K,则表示进程i需要j类资源的最大数目为K。

分配矩阵Allocation[i][j]:这也是一个i×j的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。

如果Allocation[i][j]=K,则表示进程i当前已分得j类资源的数目为K。

需求矩阵Need[i][j]:这也是一个i ×j 的矩阵,用以表示每一个进程尚需的各类资源数。

如果Need[i][j]=K ,则表示进程i 还需要j 类资源K 个,方能完成其任务。

上述三个矩阵间存在关系:Need[i][j]= Max[i][j]- Available[i]2.程序流程图2.1初始化函数chushihua()输入进程的数量n 和资源种类数m 。

使用for 循环在二维数Allocation[i][j]中输入各进程当前已分配的资源数量。

使用for 循环在二维数组Max[i][j]中输入各进程对各类资源的最大需求,并求出对应的二维数组Need[i][j]用来记录尚需分配的资源。

使用for 循环在一维数组All[]中输入各种资源的总数量,并求出各类资源尚可利用的数量Available[j]。

图1 初始化函数chushihua()流程图2.2显示当前状态函数show()用于输出当前各种数组的情况。

2.3银行家算法bank()a、先输入申请资源的进程k,判断是否k>n-1。

再输入该进程申请各类资源的数量,没输入一个要申请的资源数都要用do……while 循环判断申请输入的情况。

判断申请是否大于需求量,如果(Request[j]>Need[k][j])则出错,提示重新输入。

否则继续判断申请是否大于可利用量,如果(Request[j]>Available[j]) 则出错,本次申请不成功,进程等待。

否则进行试分配。

试分配后调用安全性检查算法safe()检测此时系统是否处于安全状态如果安全继续运行,如果不安全将试分配的数据恢复。

b、进程i发出请求申请k个j资源,Request i[j]=k(1)检查申请量是否不大于需求量:Request i[j]<=need[i,j],若条件不符重新输入,不允许申请大于需求量。

(2)检查申请量是否小于系统中的可利用资源数量:Requesti[j]<=available[i,j],若条件不符就申请失败,阻塞该进程,用goto语句跳转到重新申请资源。

(3)若以上两个条件都满足,则系统试探着将资源分配给申请的进程,并修改下面数据结构中的数值:Available[i,j]= Available[i,j]- Request i[j];详细设计Allocation[i][j]= Allocation[i][j]+ Request i[j];need[i][j]= need[i][j]- Request i[j];(4)试分配后,执行安全性检查,调用safe()函数检查此次资源分配后系统是否处于安全状态。

若安全,才正式将资源分配给进程;否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。

(5)用do{…}while 循环语句实现输入字符y/n判断是否继续进行资源申请。

图2 银行家算法bank()流程图2.4安全性检查算法safe()a、令全局变量l=0,l用来记录有几个进程是Finish[i]=1的,当l=n是说明系统状态是安全的。

使用for循环逐个查找Finish[i]==0的进程,设置记数器counter用来记录满足条件Work[j]>=Need[i][j]的资源类数,如果满足则给counter加一,如果counter==m,则表示i进程的每类资源都符合Work[j]>=Need[i][j],把此时进程i的值存入存储安全序列p[l]中,使Finish[i]=0,表示i进程标志为可分配。

释放资源使Work[j]=Work[j]+Allocation[i][j],给l加一详细设计图3 安全性检查算法safe()流程图b、检查过程:(1)设置两个向量:工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work= Available。

Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。

开始时先做Finish[i]=0;当有足够的资源分配给进程时,再令Finish[i]=1。

操作系统课程设计报告(2)在进程中查找符合以下条件的进程:条件1:Finish[i]=0;条件2:need[i][j]<=Work[j]若找到,则执行步骤(3)否则,执行步骤(4)(3)当进程获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work[j]= Work[j]+ Allocation[i][j];Finish[i]=1;goto step 2;(3)如果所有的Finish[i]=1都满足,则表示系统处于安全状态,否则,处于不安全状态。

四、运行结果(含测试和用户使用说明书)1.测试与分析(1)初始化:输入进程的数量n,资源种类数m,已分配的资源数Allocation[i][j],各进程对各类资源的最大需求数Max[i][j],各种资源的总数量All[]。

(2)显示当前状态:输出各类资源尚可利用的数量Available,各进程对各类资源的最大需求数Max[i][j],已分配的资源数Allocation[i][j],尚需分配的资源数Need[i][j],以及安全序列。

(3)输入申请资源数Request[j]:输入申请资源数Request[1]=(1,0,2),并逐个判断是否满足条件:Request i[j]<=need[i,j];Requesti[j]<=available[i,j].如果满足条件,申请资源成功。

输出安全序列以及各类资源尚可利用的数量Available,各进程对各类资源的最大需求数Max[i][j],已分配的资源数Allocation[i][j],尚需分配的资源数Need[i][j],的值输入申请资源数Request[4]=(3,3,0),进程4申请资源0的数量:3小于进程4的尚需资源4,但是它大于可利用资源2,所以没有那么多资源,本次申请不成功,应该阻塞等待。

(4)输入申请资源数Request[0]=(0,2,0):虽然Request[0]=(0,2,0)满足条件:Requesti[j]<=need[i,j];Requesti[j]<=available[i,j],但是试分配后,状态不安全,所以恢复原状态。

显示各类资源尚可利用的数量Available,各进程对各类资源的最大需求数Max[i][j],已分配的资源数Allocation[i][j],尚需分配的资源数Need[i][j],的值。

2.用户说明书程序开始运行后,首先进行初始化数据,提示输入进程的数量n,资源种类数m,已分配的资源数Allocation[i][j],之后按屏幕显示的提示操作。

五、课程设计小结与心得体会设计开始的时候,由于整体对银行家算法还没有完全理解透,再加上没认真预习、思考不够认真、对书本的知识不够扎实,所以一脸惘然,不知道从哪里开始着手.才发现这次课程设计没我想得那么简单,回寝室后,连忙查看相关的书,以及通过上网查找相关的资料,最终对银行家算思想有了彻底的了解,银行家分配算法原则是: 当进程申请资源时,如果系统中现存资源数能满足进程的当前资源申请量以及申请的资源数要小于需要的资源数(request[j]<=need[i][j]||request[j]<=available[j])并且还要验证是否有安全,只有在安全情况下才能将资源分配给它,也即银行家算法能避免死锁的发生。

接下来的任务就是开始编写程序,刚开始由于这学期对c++知识没有学习好,所以刚编写时有很大的难度,把一些本来可以用很少话解决的问题很多都复杂化了,这时我才发现我有那么多的不足,只好重新拿出以前的书,把不懂的大概都看了一遍,脑子里总算有了理解.通过这次实践,我相信,只要自己在每一次实践中都能仔细思考,课程设计其实都不会很难,关键在于自己能不能认真思考,能不能亲自动手做实验,而不是想着其他人的劳动果实,其次你还要多操作,只有多操作才能从中发现问题,才能及时向老师和同学请教,解决问题,从而更好的掌握书本中知识。

相关文档
最新文档