操作系统课设Word格式文档下载.docx
《操作系统课设Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统课设Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
六、源程序7
七、心得体会11
银行家算法设计与实现
一、设计目的
本课程设计是学习完《操作系统原理》课程后,进行的一次全面的综合训练。
通过这次课程设计,让我们更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强动手能力。
二、设计内容
编制银行家算法通用程序,并检测所给状态的系统安全性。
实验环境:
环境不限,可以在vc和java等环境下完成,操作系统平台可以选择Windows,Linux等平台。
三、银行家算法的基本思想
(一)死锁
在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险——死锁。
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
产生死锁的原因可归结为如下两点:
(1)竞争资源。
(2)进程间推进顺序非法。
死锁的发生必须具备下列四个必要条件:
(1)互斥条件。
(2)请求和保持条件。
(3)不剥夺条件。
(4)环路等待条件。
(二)系统安全状态
避免死锁的实质在于:
系统在进行资源分配时,如何使系统不进入不安全状态。
所谓安全状态,是指系统能按某种进程顺序(P1,P2,……,Pn)(称<
P1,P2,……,Pn>
序列为安全序列),来为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利的完成。
如果系统无法找到这样一个安全序列,则称系统处于不安全状态。
(三)银行家算法避免死锁
为实现银行家算法,系统中必须设置若干数据结构。
1、银行家算法中的数据结构
(1)可利用资源向量Available。
这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。
Available[j]=K,则表示系统中现有Rj类资源K个。
(2)最大需求矩阵Max。
这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。
如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
(3)分配矩阵Allocation。
这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。
如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。
(4)需求矩阵Need。
这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。
如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
上述三个矩阵存在如下关系:
Need[i,j]=Max[i,j]-Allocation[i,j]
2、银行家算法
设Request[i]是进程Pi的请求向量,如果Request[i,j]=K,表示进程需要K个Rj类型的资源。
当Pi发出资源请求后,系统按下述步骤进行检查:
(1)如果Request[i,j]<
=Need[i,j],便转向步骤
(2);
否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request[i,j]<
=Available[j],便转向步骤(3);
否则,表示尚无足够资源,Pi须等待。
(3)系统尝试着把资源分配给进程Pi,并修改下面数据结构中的数值:
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];
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
若安全,才正式将资源分配给进程Pi,以完成本次分配;
否则,将本次的尝试分配作废,恢复原来的资源分配状态,让进程Pi等待。
3、安全性算法
系统所执行的安全性算法可描述如下:
(1)设置两个向量:
①工作向量Work:
它表示系统可提供给进程继续运行所需要的各类资源数目,它含有m个元素,在执行安全算法开始时,Work=Available;
②Finish:
它表示系统是否有足够的资源分配给进程,使之运行完成。
开始时先做Finish[i]=false;
当有足够资源分配给进程时,再令Finish[i]=true。
(2)从进程集合中找到一个能满足下述条件的进程:
①Finish[i]=false;
②Need[i,j]<
=Work[j];
若找到,执行步骤(3),否则,执行步骤(4)。
(3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j]=Work[j]+Allocation[i,j];
Finish[i]=true;
gotostep2;
(4)如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;
否则,系统处于不安全状态。
四、系统模块间关系图、流程图
NoAllNo
Yes
No
5、输入、输出数据
Process
Max
Allocation
Available
P0
0044
0032
1622
P1
2750
1000
P2
361010
1354
P3
0984
0332
P4
06610
0014
输入进程P2提出请求(1,2,2,2)
输出如图:
6、源程序
/***************************/
/*专业:
10计科2班*/
/*姓名:
杨茜*/
/*学号:
100104021133*/
/*课设:
银行家算法*/
#include<
stdio.h>
stdlib.h>
#defineMAX_PROCESS32//最大进程数
#defineMAX_COURCE64//最大资源类别
intMAX_FACT_PROCESS;
//实际总进程数
intMAX_FACT_COURCE;
//实际资源类别数
intAvailable[MAX_COURCE];
//可利用资源向量
intMax[MAX_PROCESS][MAX_COURCE];
//最大需求矩阵
intAllocation[MAX_PROCESS][MAX_COURCE];
//分配矩阵
intNeed[MAX_PROCESS][MAX_COURCE];
//需求矩阵
intRequest_PROCESS;
//发出请求的进程
intRequest_COURCE_NEMBER[MAX_COURCE];
//请求资源数
boolFinish[MAX_COURCE];
//表示系统是否有足够的资源分配给进程的标识数组
intAn[MAX_PROCESS];
//安全序列
/*安全性算法*/
boolAnquan()
{
inti=0;
intt=0;
intWork[MAX_COURCE];
for(i=0;
i<
MAX_FACT_COURCE;
i++)//工作向量Work[],表示系统可提供进程运行的各类资源数
Work[i]=Available[i];
boolFinish[MAX_PROCESS]={false};
intn=0;
intm=0;
while(true)//找出依次的安全进程
{
MAX_FACT_PROCESS;
i++)
{
for(t=0;
t<
t++){
if(false==Finish[i]&
&
Need[i][t]<
=Work[t])//进程i的资源需求是否满足
;
else//有不满足的条件就退出
break;
}
//for是否正常结束
if(t==MAX_FACT_COURCE)//不是从else跳出的
{
An[m]=i;
m++;
t=0;
while(t<
MAX_FACT_COURCE)
{
Work[t]=Work[t]+Allocation[i][t];
//释放进程的资源
t++;
}
Finish[i]=true;
i=-1;
//进程从头开始循环
}
if(m==MAX_FACT_PROCESS)//进程分配完毕找到安全序列
returntrue;
else
returnfalse;
}
}
/*需求请求*/
boolRq()
inty;
for(y=0;
y<
y++)//判断请求是否满足系统供给
if(Request_COURCE_NEMBER[y]<
=Need[Request_PROCESS][y]&
Request_COURCE_NEMBER[y]<
=Available[y])
continue;
else
y++)//分配资源,并修改数据结构中的数值
Available[y]=Available[y]-Request_COURCE_NEMBER[y];
Allocation[Request_PROCESS][y]=Allocation[Request_PROCESS][y]+Request_COURCE_NEMBER[y];
Need[Request_PROCESS][y]=Need[Request_PROCESS][y]-Request_COURCE_NEMBER[y];
returntrue;
intmain()
{
intj;
printf("
输入进程数:
"
);
scanf("
%d"
&
MAX_FACT_PROCESS);
输入资源类别数:
MAX_FACT_COURCE);
i++)//已分配矩阵
printf("
进程%d输入已分配的:
i);
for(j=0;
j<
j++)
scanf("
Allocation[i][j]);
i++)//最大分配数矩阵
进程%d最大分配数:
Max[i][j]);
需求矩阵Need:
i++)//需求矩阵
\n"
{Need[i][j]=Max[i][j]-Allocation[i][j];
Need[i][j]);
\n输入可利用资源:
for(j=0;
Available[j]);
if(Anquan())
安全序列:
P%d\t"
An[i]);
elseprintf("
没有安全序列!
/*****************************************/
intn=1;
while(n!
=0)//循环继续
\n输入发出请求的进程:
scanf("
Request_PROCESS);
\n输入请求资源:
for(i=0;
Request_COURCE_NEMBER[i]);
if(Rq())
printf("
进行安全检查……\n"
if(Anquan())
printf("
进程%d可以分到资源!
Request_PROCESS);
for(i=0;
printf("
P%d"
else
i++)//还原资源
Available[i]=Available[i]+Request_COURCE_NEMBER[i];
Allocation[Request_PROCESS][i]=Allocation[Request_PROCESS][i]-Request_COURCE_NEMBER[i];
Need[Request_PROCESS][i]=Need[Request_PROCESS][i]+Request_COURCE_NEMBER[i];
进程%d不能分到资源!
/*****************************************/
是否继续(0退出)"
n);
return0;
}
七、心得体会
为期两周的课程设计就这样结束了,因为银行家算法在学习操作系统课程时学的还不错,老师一布置此题时,就有了算法框架。
但是可能是假期都没有写程序,突然就无法写了,但是,有万前平同学的讲解,很快就写好了大概。
虽然没有任何语法错误,但是其中也有着逻辑上的错误,如输入进程需求的检查算法总是没办法调用,后来有万前平同学教我修改后就可以进行了。
之后也加了一个循环输入的算法。
谢谢老师这段时间的讲解,还有感谢万前平同学耐心帮助!