操作系统课设Word格式文档下载.docx

上传人:b****6 文档编号:19078145 上传时间:2023-01-03 格式:DOCX 页数:14 大小:104.39KB
下载 相关 举报
操作系统课设Word格式文档下载.docx_第1页
第1页 / 共14页
操作系统课设Word格式文档下载.docx_第2页
第2页 / 共14页
操作系统课设Word格式文档下载.docx_第3页
第3页 / 共14页
操作系统课设Word格式文档下载.docx_第4页
第4页 / 共14页
操作系统课设Word格式文档下载.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

操作系统课设Word格式文档下载.docx

《操作系统课设Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统课设Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。

操作系统课设Word格式文档下载.docx

六、源程序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;

}

七、心得体会

为期两周的课程设计就这样结束了,因为银行家算法在学习操作系统课程时学的还不错,老师一布置此题时,就有了算法框架。

但是可能是假期都没有写程序,突然就无法写了,但是,有万前平同学的讲解,很快就写好了大概。

虽然没有任何语法错误,但是其中也有着逻辑上的错误,如输入进程需求的检查算法总是没办法调用,后来有万前平同学教我修改后就可以进行了。

之后也加了一个循环输入的算法。

谢谢老师这段时间的讲解,还有感谢万前平同学耐心帮助!

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

当前位置:首页 > 高中教育 > 高中教育

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

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