- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1. 题目分析
1.1 设计目的
理解死锁产生的原因和必要条件
了解避免死锁的几种基本方法
掌握银行家算法及安全性算法
1.2 设计内容
设计内容包括银行家算法和安全性算法,以及用VC界面实现输出
1.3 相关知识概述
银行家算法是一种最有代表性的避免死锁的算法。
要解释银行家算法,必须先解释操作系统安全状态和不安全状态。
安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。
不安全状态:不存在一个安全序列。不安全状态一定导致死锁。
安全序列:一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j i )当前占有资源量之和。
2. 概要设计
2.1主要数据结构描述
static int MAX[5][3]; //最大需求矩阵
static int AVAILABLE[3]; //可利用资源矩阵
static int ALLOCATION[5][3]; //分配矩阵
static int NEED[5][3]; //需求矩阵
因为数组成员MAX,AVAILABLE, ALLOCATION, NEED的值每次调用一次银行家算法,如果分配成功,都会改变,所以将他们设定为静态成员变量。
int Request[3]; //请求向量
int Work[3]; //工作向量
bool FINISH[5];//标记系统是否有足够的资源分配给进程
2.2 流程图
(1)银行家算法流程图
单击“执行银行家算法”按钮时会调用OnButton1()函数,相当于银行家算法
注:只要不按“退出”按钮退出程序,数组MAX,AVAILABLE, ALLOCATION, NEED中会保留上一次执行完后变化的值,不停的单击“进行银行家算法”按钮,程序会在上一次执行完后的基础上反复的执行银行家算法。
(2)安全性算法流程图
3. 详细设计
3.1 主要算法描述
当进程pi提出资源申请时,系统执行下列步骤:
(1)若Request≤Need,转(2);
否则错误返回
(2)若Request≤Available,
转(3);否则进程等待
(3)假设系统分配了资源,则有:
Available:=Available-Request;
Allocation:=Allocation+Request;
Need:=Need-Request
若系统新状态是安全的,则分配完成
若系统新状态是不安全的,则恢复原状态,进程等待
安全性检查的步骤:
(1) Work:=Available;
Finish:=false;
(2) 寻找满足条件的i:
Finish=false;
Need≤Work;
如果不存在,则转(4)
(3) Work:=Work+Allocation;
Finish:=true;
转(2)
(4) 若对所有i,Finish=true,则系统处于安全状态,否则处于不安全状态
3.2 程序界面设计
4. 编码实现
4.1 开发工具简介
Visual C++集成开发环境下下实现的
4.2 部分程序源码
int CSisuoDlg::MAX[5][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int CSisuoDlg::AVAILABLE[3]={3,3,2};
int CSisuoDlg::ALLOCATION[5][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
int CSisuoDlg::NEED[5][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
int CSisuoDlg::safe()
{
int i,j,k,l=0;
int Work[3];
bool FINISH[5];
int p[5];
for(i=0;i3;i++)
Work[i]=AVAILABLE[i];
for(i=0;i5;i++)
{ FINISH[i]=false;}
for(i=0;i5;i++)
{
if(FINISH[i]==true
文档评论(0)