死锁避免算法设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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判断是否继续进行资源申请。