计算机操作系统 课程设计报告 银行家算法_银行家算法课程设计

其他范文 时间:2020-02-28 16:32:19 收藏本文下载本文
【www.daodoc.com - 其他范文】

计算机操作系统 课程设计报告 银行家算法由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“银行家算法课程设计”。

《计算机操作系统》

课 程 设 计 报 告

题 目: 银行家算法

班 级: XXXXXXXXXXXXXXXX 姓 名: XXM 学 号: XXXXXXXXXXXX 指导老师: XXXXXXXXXXXXXX 设计时间: XXXXXXXXXXXXXXX 一.设计目的1、掌握死锁概念、死锁发生的原因、死锁产生的必要条件;

2、掌握死锁的预防、死锁的避免;

3、深刻理解死锁的避免:安全状态和银行家算法;

二.银行家算法

1.简介

银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。

2.数据结构

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].3.算法原理

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。

三.算法实现

1.初始化

由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。

2.银行家算法

在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。

银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。(1)如果REQUEST [cusneed] [i]

3.安全性检查算法

(1)设置两个工作向量Work=AVAILABLE;FINISH(2)从进程集合中找到一个满足下述条件的进程,FINISH==false;NEED

4.算法流程图

1)初始化算法流程图

2)银行家算法流程图:

3)安全性算法流程图:

4.代码(C语言)

#include #include #include #include /*用到了getch()*/ #define M 5 /*进程数*/ #define N 3 /*资源数*/ #define FALSE 0 #define TRUE 1

/*M个进程对N类资源最大资源需求量*/ int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};/*系统可用资源数*/ int AVAILABLE[N]={10,5,7};/*M个进程对N类资源最大资源需求量*/ int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};

/*M个进程已经得到N类资源的资源量 */ int

NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};

/*M个进程还需要N类资源的资源量*/ int Request[N]={0,0,0};

void main(){

int i=0,j=0;char flag;

void showdata();void changdata(int);void rstordata(int);int chkerr(int);showdata();enter:{

printf(“请输入需申请资源的进程号(从0到”);

printf(“%d”,M-1);

printf(“):”);

scanf(“%d”,&i);} if(i=M){

printf(“输入的进程号不存在,重新输入!n”);

goto enter;}

err:{

printf(“请输入进程”);

printf(“%d”,i);

printf(“申请的资源数n”);

printf(“类别: A B Cn”);printf(“ ”);

for(j=0;j

{

scanf(“%d”,&Request[j]);

if(Request[j]>NEED[i][j])

{

printf(“%d”,i);

printf(“号进程”);

printf(“申请的资源数 > 进程”);

printf(“%d”,i);

printf(“还需要”);

printf(“%d”,j);printf(“类资源的资源量!申请不合理,出错!请重新选择!n”);

goto err;

}

else

{

if(Request[j]>AVAILABLE[j])

{

printf(“进程

”);

printf(“%d”,i);

printf(“申请的资源数大于系统可用”);

printf(“%d”,j);

printf(“类资源的资源量!申请不合理,出错!请重新选择!n”);

goto err;

}

}

} }

changdata(i);if(chkerr(i)){

rstordata(i);

showdata();} else

showdata();

printf(“n”);

printf(“按'y'或'Y'键继续,否则退出n”);

flag=getch();

if(flag=='y'||flag=='Y'){

goto enter;

} else {

exit(0);}

}

/*显示数组*/ void showdata(){ int i,j;printf(“系统可用资源向量:n”);printf(“***Available***n”);printf(“资源类别: A B Cn”);printf(“资源数目:”);for(j=0;j

printf(“%d ”,AVAILABLE[j]);} printf(“n”);printf(“n”);printf(“各进程还需要的资源量:n”);printf(“******Need******n”);printf(“资源类别: A B Cn”);for(i=0;i

printf(“ ”);

printf(“%d”,i);

printf(“号进程:”);

for(j=0;j

{

printf(“

%d ”,NEED[i][j]);

}

printf(“n”);} printf(“n”);printf(“各进程已经得到的资源量: n”);printf(“***Allocation***n”);printf(“资源类别: A B Cn”);for(i=0;i

printf(“ ”);

printf(“%d”,i);

printf(“号进程:”);

/*printf(“:n”);*/

for(j=0;j

{

printf(“

%d ”,ALLOCATION[i][j]);

}

printf(“n”);

}

printf(“n”);}

/*系统对进程请求响应,资源向量改变*/ void changdata(int k){ int j;

for(j=0;j

AVAILABLE[j]=AVAILABLE[j]-Request[j];

ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];

NEED[k][j]=NEED[k][j]-Request[j];}

}

/*资源向量改变*/

void rstordata(int k)

{ int j;

for(j=0;j

AVAILABLE[j]=AVAILABLE[j]+Request

[j];

ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];

NEED[k][j]=NEED[k][j]+Request[j];

}

}

/*安全性检查函数*/ int chkerr(int s){ int WORK,FINISH[M],temp[M];int i,j,k=0;

for(i=0;i

WORK=AVAILABLE[j];

i=s;

printf(“n”);

while(i

{

if(FINISH[i]==FALSE&&NEED[i][j]

{

printf(“系统不安全!本次资源申请不成功!n”);

printf(“n”);

return 1;

}

}

} WORK=WORK+ALLOCATION[i][j];

FINISH[i]=TRUE;

temp[k]=i;k++;i=0;

printf(“n”);

printf(“经安全性检查,系统安全,本printf(”n“);

printf(” 本次安全序列:n“);printf(”进程依次为“);for(i=0;i

printf(”%d“,temp[i]);

次分配成功。n”);} else { i++;} } for(i=0;i

printf(“-> ”);}

printf(“n”);return 0;四.程序运行截图

0号进程申请资源{1,2,3},各向量发生变化

0和进程继续申请资源{2,2,0},各向量变化

2号进程申请资源,由于NEED[2]={9,0,2},前两次申请不合理,系统处于不安全状态太。第三次2号申请资源向量为{1,0,2},系统回到安全状态,并得出新的安全序列3-0-1-2-4。

五.心得体会

从此次的课程设计中,我收获很多。首先也是最重要的一点是对处理机调度与死锁有了深入的理解;其次,再次巩固了C语言编程。

在用C语言设计和编写银行家算法和安全性检查算法时遇到了一些困难都克服了。在使程序界面美观、能够持续循环运行时用了很多方法,花了比较多的时间。最后选择用goto语句控制,我觉得在此实验中比较好,代码阅读起来更加方便。

操作系统课程设计(银行家算法的模拟实现)

操作系统课程设计(银行家算法的模拟实现)一、设计目的 1、进一步了解进程的并发执行。2、加强对进程死锁的理解。3、用银行家算法完成死锁检测。二、设计内容给出进程需求矩阵......

操作系统银行家算法实验报告

实验四死锁一、实验目的 当系统的总资源数m小于或等于所有进程对对资源的最大需求时,就可能产生 死锁。死锁会引起计算机系统的瘫痪。银行家算法是在实现资源分配时避免死锁......

操作系统课程设计实验报告用C++实现银行家算法

操 作 系 统实 验 报 告(2) 学院:计算机科学与技术学院 班级:计091 学号:姓名: 时间:2011/12/30 目 录1.实验名称……………………………………………………3 2.实验目的…………......

操作系统课程设计模拟银行家算法避免死锁(优秀)

模拟通过银行家算法避免死锁一、银行家算法产生的背景及目的1:在多道程序系统中,虽然借助于多个进程的并发执行来改善系统的利用率,提高系统的吞吐量,但可能发生一种危险—死锁......

东南大学操作系统实验报告银行家算法

操作系统实验三:银行家算法的实现一、基本信息:a) 实验题目:银行家算法的实现 b) 完成人姓名:韩璐璐 c) 学号:71114115 d) 报告日期:2016.5.27二、实验目的通过实验,加深对多实例......

下载计算机操作系统 课程设计报告 银行家算法word格式文档
下载计算机操作系统 课程设计报告 银行家算法.doc
将本文档下载到自己电脑,方便修改和收藏。
点此处下载文档

文档为doc格式

热门文章
点击下载本文