计算机操作系统程序设计课程考核报告_银行家算法模拟实现
宿 迁 学 院
计算机操作系统程序设计
课程考核报告
银行家算法模拟实现
班 级: 09软件(1)
学 号:
姓 名:
指导老师:
2011年12月 19日
目录
1. 课程设计简介------------------------------------------------3
1.1课程设计题目------------------------------------------------------------- 3
1.2课程设计目的-----------------------------------------3
1.3 课程设计要求----------------------------------------3 2 实验原理
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
-------------------------------------------4
2.1 算法的来源及基本思想---------------------------------4
2.2 死锁产生的条件---------------------------------------4
2.3 模拟进程申请资源-------------------------------------5 3 概要设计------------------------------------------------5
4 详细设计------------------------------------------------7 5 代码设计------------------------------------------------8 6 调试分析----------------------------------------------- 14
7 心得体会------------------------------------------------21
8 参考文献------------------------------------------------21
1 课程设计简介:
1.1 课程设计题目
银行家算法的模拟实现。应用银行家算法验证进程安全性检查及分配资源。
1.2 课程设计目的
本设计的目的是通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。
A、了解进程产生死锁的原因,了解为什么要进行死锁的避免。
B、掌握银行家算法的数据结构,了解算法的执行过程,加深对银行家算法的理解。
1.3 课程设计要求
设计一个n 个并发进程共享m 个系统资源的系统。进程可动态申请资源和释放资源,系统按各进程的申请动态的分配资源。要求采用银行家算法实现。 (1)初始化这组进程的最大资源请求和依次申请的资源序列。把各进程已占
用和需求资源情况
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
在进程控制块中。假定进程控制块的内容包括:
进程名,状态,当前申请量,资源需求总量,已占资源量,能执行完标
志。其中,进程的状态有:就绪、等待和完成。当系统不能满足进程的
资源请求时,进程处于等待态。资源需求总量
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示进程运行过程中对资
源的总的需求量。
已占资源量表示进程目前已经得到但还未归还的资源量。因此,进程在
以后还需要的剩余资源量等于资源需要总量减去已占资源量。显然每个
进程的资源需求总量不应超过系统拥有的资源总量。 (2)银行家算法分配资源的原则是:当某个进程提出资源请求时,假定先分
配资源给它,然后查找各进程的剩余请求,检查系统的剩余资源量是否
由于进程的分配而导致系统死锁。若能,则让进程等待,否则,让进程
的假分配变为真分配。
(a) 查找各进程的剩余请求,检查系统的剩余资源量是否能满足其中
一进程。如果能,则转b)。
(b) 将资源分配给所需的进程,这样,该进程已获得资源最大请求,
最终能运行完成。标记这个进程为终止进程,并将其占有的全部
资源归还给系统。
重复第a)步和第b )步,直到所有进程都标记为终止进程,或直到一个死锁发生。若所有进程都标记为终止进程,则系统的初始状态是安全的,否则为不安全的。若安全,则正式将资源分配给它,否则假定的分配作废,让其等待。
2 实验原理分析:
2.1 算法的来源及基本思想
银行家算法,顾名思义是来源于银行的借贷业务,通过这个算法可以用来解决生活中的实际问题,如银行贷款等。一定数量的本金要应多个客户的借贷周转,为了防止银行加资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。
2.2 死锁产生的条件
银行家算法是用来避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
死锁的产生,必须同时满足四个条件:
A、即一个资源每次只能由一个进程使用;
B、第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,单它仍继续宝石已得到的所有其他资源;
C、第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;
D、第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。
防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。银行家算法是避免死锁的方法中,施加的限制条件较弱的,有利于获得令人满意的系统性能的方法。在该方法中把系统的状态分为安全状态和不安
全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
2.3 模拟进程申请资源
把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。显然,,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁.
3 概要设计:
银行家算法可分为个主要的功能模块,其描述如下:
1.初始化
由用户输入数据,分别对运行的进程数、总的资源种类数、总
资源数、各进程所需要的最大资源数量(Max),已分配的资源数量
赋值。
2.安全性检查算法
(1)设置两个工作向量Work=AVAILABLE;FINISH=false;
(2)从进程集合中找到一个满足下述条件的进程,
FINISH==false;
NEED<=Work;
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work+=ALLOCATION;
Finish=true;
(4).如所有的进程Finish= true,则表示安全;否则系统不安全。
3. 银行家算法
在避免死锁的方法中,所施加的限制条件较弱,有可能获得令
人满意的系统性能。在该方法中把系统的状态分为安全状态和不安
全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全
的;若是,才分配。它是最具有代表性的避免死锁的算法。
设进程j提出请求REQUEST [i],则银行家算法按如下规则
进行判断。
(1).如果REQUEST [j] [i]<= NEED[j][i],则转(2);否则,
出错。
(2).如果REQUEST [j] [i]<= AVAILABLE[j][i],则转(3);
否则,出错。
(3).系统试探分配资源,修改相关数据:
AVAILABLE[i]-=REQUEST[j][i];
ALLOCATION[j][i]+=REQUEST[j][i];
NEED[j][i]-=REQUEST[j][i];
用到的数据结构:
实现银行家算法要有若干数据结构,它们用来表示资源分配系统的状态。令n表示系统中进程的数目,m表示资源的分类数。还需要以下数据结构:
1).Available是一个长度为m的向量,它表示每类资源可用的数量。Available [j]=k,表示j类资源可用的数量为k。
2).Max是一个n×m矩阵,它表示每个进程对资源的最大需求。Max [i,j]=k,表示进程pi至多可以申请k个j类资源单位。
3).Allocation是一个n×m矩阵,它表示当前分给每个进程的资源数目。Allocation [i,j]=k,表示进程i当前分到k个j类资源。
4).Need是一个n×m矩阵,它表示每个进程还缺少多少资源。Need[i,j]=k,表示进程pi尚需k个j类资源才能完成其任务。显然Need[i,j]= Max [i,j]- Allocation [i,j]。
4 详细设计:
1主函数main()
要求在主函数中输入运行的进程数、总的资源种类数、总资源
数、各进程所需要的最大资源数量(Max),已分配的资源数量,并
对这些数据进行有效性检验,不符合条件的数据要进行重新输入。
2函数showdata( )
Showdata()函数用来输出资源的分配情况。对各进程资源的总数
量、系统目前可利用的资源数量、各进程还需要的资源数量及各进程已
分配的资源数量进行输出。
3函数bank( )
Bank()函数为银行家算法,对需申请资源的进程号j和所要申请的
资源数量Request[j]进行输入,并分别将Request[j]与Need[i][j]和
Available[j]进行比较,观察所要申请的资源数目是否合理。如合理,
则判断此时系统是否安全,若安全则输出资源的分配情况,否则输出原
来的系统资源分配情况,重新输入申请资源的数量。
4函数changdata( )
Changdata()函数用来改变可用资源和已经拿到资源和还需要的资
源的值。当申请的资源数目合理时,对现在的系统资源分配情况进行刷
新。
5函数chkerr()
Chkerr()函数用来检查系统此时的安全性。如果系统能够找到
一个安全执行的序列,则各进程能正常运行终结,否则,此进程进入阻
塞状态。
6函数 rstordata( )
Changdata()函数,改变可用资源和已经拿到资源和还需要的资源的
值。若判断出申请资源后系统是安全的,则要改变系统现在的资源分配
情况:
Available[j]= Available[j]+Request[j];
Allocation[k][j]= Allocation [k][j]-Request[j];
Need[k][j]=Need[k][j]+Request[j]
5 代码设计:
#include
#include
#include
#define FALSE 0
#define TRUE 1
#define W 10
#define R 20
int M ; //总进程数
int N ; //资源种类
int ALL_RESOURCE[W];//各种资源的数目总和
int MAX[W][R]; //M个进程对N类资源最大资源需求量 int AVAILABLE[R]; //系统可用资源数
int ALLOCATION[W][R]; //M个进程已经得到N类资源的资源量 int NEED[W][R]; //M个进程还需要N类资源的资源量 int Request[R]; //请求资源个数
void showdata() //函数showdata,输出资源分配情况 {
int i,j;
printf("\n\n各种资源的总数量(all):\n");
for (j=0;j=M)
{
printf(" 请输入需申请资源的进程号(从P1到P%d,否则重输入!):",M);
printf("p");
scanf("%d",&i);
if(i<1||i>M)
printf(" 输入的进程号不存在,重新输入!\n");
}
printf(" 请输入进程P%d申请的资源数:\n",i);
for (j=0;jNEED[i-1][j]) //若请求的资源数大于进程还需要i类资源的资源量j
{
printf(" 进程P%d申请的资源数大于进程P%d还需要%d类资源的资源量!",i,i,j);
printf("申请不合理,出错!请重新选择!\n\n");
flag='N';
break;
}
else
{
if(Request[j]>AVAILABLE[j]) //若请求的资源数大于可用资源数
{
printf("进程P%d申请的资源数大于系统可用%d类资源的资源量!",i,j);
printf("申请不合理,出错!请重新选择!\n\n");
flag='N';
break;
}
}
}
if(flag=='Y'||flag=='y')
{
changdata(i-1); //调用changdata(i)函数,改变资源数
if(chkerr(i-1)) //若系统安全
{
rstordata(i-1); //调用rstordata(i)函数,恢复资源数
showdata(); //输出资源分配情况
}
else //若系统不安全
showdata();
} //输出资源分配情况
else //若flag=N||flag=n
showdata();
printf("\n");
printf("是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'
键退出演示: ");
scanf("%c",&flag);
}
}
void main() //主函数
{
int i=0,j=0,p;
printf(" *************************************** \n");
printf(" 银行家算法的模拟实现 \n");
printf(" 20090307143 吴天一 \n");
printf(" ***************************************
\n\n");
printf("请输入总进程数:");
scanf("%d",&M);
printf("请输入总资源种类:");
scanf("%d",&N);
printf("请输入总资源数(all_resource):");
for(i=0;iALL_RESOURCE[j])
printf("\n占有资源超过了声明的该资源总数,请重新输入!\n");
}while (MAX[i][j]>ALL_RESOURCE[j]);
}
}
printf("依次输入各进程已经占据的资源数量(allocation):\n");
for (i=0;iMAX[i][j])
printf("\n占有资源超过了声明的最大资源,请重新输入
\n");
}while (ALLOCATION[i][j]>MAX[i][j]);
}
}//初始化资源数量
for (j=0;j
本文档为【计算机操作系统程序设计课程考核报告_银行家算法模拟实现】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。