操作系统课程设计之模拟通过银行家算法避免死锁Word下载.docx

上传人:b****4 文档编号:17103665 上传时间:2022-11-28 格式:DOCX 页数:13 大小:89.52KB
下载 相关 举报
操作系统课程设计之模拟通过银行家算法避免死锁Word下载.docx_第1页
第1页 / 共13页
操作系统课程设计之模拟通过银行家算法避免死锁Word下载.docx_第2页
第2页 / 共13页
操作系统课程设计之模拟通过银行家算法避免死锁Word下载.docx_第3页
第3页 / 共13页
操作系统课程设计之模拟通过银行家算法避免死锁Word下载.docx_第4页
第4页 / 共13页
操作系统课程设计之模拟通过银行家算法避免死锁Word下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

操作系统课程设计之模拟通过银行家算法避免死锁Word下载.docx

《操作系统课程设计之模拟通过银行家算法避免死锁Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计之模拟通过银行家算法避免死锁Word下载.docx(13页珍藏版)》请在冰豆网上搜索。

操作系统课程设计之模拟通过银行家算法避免死锁Word下载.docx

三、银行家算法及安全性算法

1:

银行家算法

设Request[i]是进程Pi的请求向量,若Request[i][j]=k;

表示进程需要j类资源k个。

当Pi发出资源请求时,系统按下属步骤进行检查;

(1)如果Request[i][j]<

=Need[i][j];

便转向步骤

(2),否则认为出错,因为它所需要的资源数已超过他所宣布的最大值。

(2)如果Request[i][j]<

=Available[i][j],便转向步骤(3),否则认为尚无足够资源,进程需等待。

(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)系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。

若安全,才正式将资源分配给进程Pi,已完成此次分配。

否则,将本次的试探分配作废,回复原来的资源分配状态,将进程Pi等待。

安全性算法

(1)设置两个向量;

工作向量Work,表示系统可提供给进程运行所需的各类资源数目,它含有m个元素,初始时Work=Available

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

开始时先做Finish[i]=true

(2)从进程中找到一个能满需下属条件的进程

1;

Finish[i]=false;

Need[i][j]<

=Work[j];

若找到执行步骤(3),否则执行步骤(4)

(3)当进程Pi顺利获得资源后,直至完成,并释放分配给它的资源,执行:

Work[j]=Work[j]+Allocation[i][j];

Finish[i]=true;

Gotostep

(2);

(5)如果所有的进程Finish[i]都满足,则表示系统处于安全状态,否则,处于不安全状态。

四、模块设计与分析及整体功能概述

模块设计与分析:

整个银行家算法分为初始化函数Init(),安全性算法函数safe(),银行家算法函数bank()三部分。

初始化函数生成开始时刻系统中的进程和资源情况,安全性算法判断当某进程申请资源时,系统能否处于安全状态。

在本实验中,若系统处于安全状态,便生成一个安全进程序列(安全序列可能有多个)。

银行家算法函数bank()负责整体的检查与异常判断。

整体功能概述:

死锁会引起系统陷入僵局,操作系统必须防止此现象的发生。

本实验通过一个动态分配资源的模拟程序,更清楚的理解死锁产生的原因和条件。

Dijkstra的银行家算法是最有代表性的避免死锁的方法。

运行程序时用户设定系统中进程和可利用资源的种类数目。

输入各进程的可利用资源Available,最大需求MAX,已分配资源Allocation,需求资源Need,之后各系统发出资源请求Request,利用实验中的安全性算法判断能否产生一个安全性队列,若能,则给该进程分配成功,否则,不予分配。

五、流程图设计

六、源代码及调试分析

#include<

iostream.h>

#defineMAXm50//定义最大进程数

#defineMAXn100//定义最大资源数

intMAX[MAXm][MAXn];

//最大需求矩阵

intAllocation[MAXm][MAXn];

//已分配矩阵

intAvailable[MAXn];

//可用资源数组

intNeed[MAXm][MAXn];

//需求矩阵

intRequest[MAXm][MAXn];

//请求矩阵

intFinish[MAXm];

//存储完成资源分配的进程

intSequence[MAXm];

//模拟的资源分配序列

intWork[MAXn];

//系统是否有足够的资源分配给进程

intm,n;

//m个进程,n个资源

#defineFalse0

#defineTrue1

voidinput();

//数据输入函数

intsafealg();

//安全性算法函数

voidbanker();

//银行家算法函数

voidmain()

{input();

safealg();

banker();

}

//*************初始化算法***************

voidinput()

{

inti,j;

//************自定义进程数目与资源种类*******************

cout<

<

"

***********************************\n"

;

*利用银行家算法避免死锁*\n"

cout<

**\n"

************************************\n"

请输入进程的数目:

cin>

>

m;

请输入资源的种类:

n;

//*****输入每个进程对每种资源的最大需求、已经获得的数量、每种类型资源的数目

各进程资源最大需求(Max),按照"

m<

x"

n<

矩阵输入:

\n"

for(i=0;

i<

i++)

{

P"

:

for(j=0;

j<

j++)

cin>

MAX[i][j];

if(j==n)

cout<

资源种类数匹配出现错误!

//当资源配置的种类数大于预先输入的数值时,出错

}

各进程当前获得资源(Allocation),按照"

矩阵输入"

endl;

{

{

cin>

Allocation[i][j];

if(j==n)

Need[i][j]=MAX[i][j]-Allocation[i][j];

//需求数等于最大需求减去已经分配数

}

系统可用资源(Available):

for(j=0;

Available[j];

//输入各种资源的可利用数

当前时刻的进程分配情况如图:

进程号-"

MAX----"

Allocation---"

Need--"

Available---\n"

//显示各进程的资源情况

"

Need[i][j];

//回车换行

//*****************银行家算法,为进程分配资源***********//

voidbanker()

intchoice;

while

(1)

输入要进行的操作(1:

分配资源2:

离开):

//用户选择

choice;

if(choice==1)//分配资源

从P0到P"

m-1<

之间选择要分配资源的进程号:

i;

if(i>

=m)

无此进程号!

请重新输入:

//重新输入进程号

}

请输入进程申请的资源(Request):

for(j=0;

Request[i][j];

//**********银行家算法进行检查*************//

{

if(Request[i][j]>

Need[i][j])

{

cout<

申请的资源大于它需要的资源数,请重新输入!

//资源申请不合理

continue;

}

Available[j])

//资源申请数目大于可利用数,无法分配,得等待

当前系统可用资源不够,请等待!

}

}

j++)//资源申请得到允许时,变换各个资源数

Available[j]=Available[j]-Request[i][j];

//可用资源减少

Allocation[i][j]=Allocation[i][j]+Request[i][j];

//所得资源增加

Need[i][j]=Need[i][j]-Request[i][j];

//仍需资源减少

if(safealg()<

0)//安全性算法的返回值

cout<

分配不成功,请等待!

for(j=0;

j++)//把资源恢复成分配之前的状态

{

Available[j]=Available[j]+Request[i][j];

Allocation[i][j]=Allocation[i][j]-Request[i][j];

Need[i][j]=Need[i][j]+Request[i][j];

}

for(i=0;

Finish[i]=False;

//没有足够的资源分配给该进程

}//if(safealg()<

0)

else

同意分配请求!

Work[j]=Available[j];

--Work----"

Need---"

Work+Allocation--"

<

Finish--"

i++)//按模拟分配序列进行分配

进程P"

Sequence[i]<

for(j=0;

Work[j]<

Need[Sequence[i]][j]<

Allocation[Sequence[i]][j]<

Allocation[Sequence[i]][j]+Work[j]<

Finish[Sequence[i]]<

//完成该进程

Work[j]=Allocation[Sequence[i]][j]+Work[j];

//回收该进程所分配的资源

}//if(safealg()>

=0)

}//if(choice=1)

elseif(choice==2)//离开————

break;

elsecout<

请输入1或2!

//只认可1或2

}//while

(1)

//*********安全性算法************//

intsafealg()

inti,j,k,l=0;

//intWork[MAXn];

//工作组

//记录序列

Work[i]=Available[i];

//工作分配初始化为系统可用资源

i++)//扫描所有进程,预设所有进程不能运行

Finish[i]=False;

{//

if(Finish[i]==True)

continue;

else//对于未运行的进程,进行如下处理

{///

j++)//找到一个满足Finish[i]=false且Need[i][j]<

=Work[j]的进程

if(Need[i][j]>

Work[j])//由于部分资源得不到满足,进程i无法运行

break;

if(j==n)//进程各类资源全部得到满足

{

Finish[i]=True;

for(k=0;

k<

k++)//进程i正常运行后,释放其占有的资源

Work[k]+=Allocation[i][k];

//工作分配加上可用资源

Sequence[l++]=i;

//模拟资源分配序列生成

i=-1;

//重新扫描所有进程从i=0开始

{//某一资源得不到满足

continue;

//试探下一个进程

}//

if(l==m)//都试探完毕

系统安全!

安全序列:

for(i=0;

l;

i++)//输出安全序列

-->

return0;

}//

系统进入不安全状态!

return-1;

分析:

在确定安全序列的过程中,要检测所有进程的Finish[i]的值,每次循环检测完后要重复从第一个进程开始。

 

七、运行结果

假设输入进程个数为5,资源种类数为3,并以此输入各进程初始时刻的各种资源数量,如下

若再继续申请资源,假设为P4,申请资源(122)

假设P1申请资源(224)有

八、心得体会

经过这次操作系统课程设计,让我受益匪浅,收获颇多。

主要体会如下:

1.利用Vc++编译程序编写银行家算法,进一步理解到通过银行家算法避免死锁的思想,同时也理解了系统死锁产生的原因及条件。

2.在实验过程中所有的设计步骤遵循老师教授的程序功能化的思想,分别定义了三个函数,init()初始化函数,safealg()安全性算法函数,bank()银行家算法函数,体现了函数的模块化思想。

这样的话,不仅提高了程序的可读性和可操作性,而且还提高了CPU的利用率和内存的利用率,因为程序的运行是局部性的,这种思想对于段页式存储管理系统尤为重要。

3.实验过程中遇到的种种疑难问题通过自己上网查找答案,锻炼了自己纠错能力和搜索有价值信息的能力及自学的能力,并且进一步巩固了自己以前学过的专业知识。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1