银行家算法《操作系统》课程设计报告

2020-12-14 05:20:07下载本文作者:会员上传
简介:写写帮文库小编为你整理了这篇《银行家算法《操作系统》课程设计报告》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《银行家算法《操作系统》课程设计报告》。

《操作系统》课程设计报告

课题:

银行家算法

专业

计算机科学与技术

学生姓名

班级

计算机

学号

指导教师

信息工程学院

一、实验要求和实验目的实验目的:本课程设计是学生学习完《操作系统原理》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。

实验要求:从课程设计的目的出发,通过设计工作的各个环节,达到以下教学要求:两人一组,每组从所给题目中任选一个(如自拟题目,需经指导教师同意),每个学生必须独立完成课程设计,不能相互抄袭,同组者文档不能相同;设计完成后,将所完成的工作交由指导教师检查;要求写出一份详细的设计报告。

二、设计内容:

课题一、编制银行家算法通用程序,并检测所给状态的系统安全性。

1)银行家算法中的数据结构:

可利用资源向量Available。这是一个含有m个

元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。Available[j]=K,则表示系统中现有Rj

类资源K个。

最大需求矩阵Max。这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。

1.分配矩阵Allocation。这也是一个n*m的矩阵,它定义了系统中每一类资料当前已分配给没一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。需求矩阵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,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:如果Request[i,j]<=

Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。

三、设计思路

设计思路A、设计进程对各在资源最大申请表示及初值确定。B、设定系统提供资源初始状态。C、设定每次某个进程对各类资源的申请表示。D、编制程序,依据银行家算法,决定其申请是否得到满足。

四、详细设计

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

2、银行家算法:在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。

设进程cusneed提出请求REQUEST

[i],则银行家算法按如下规则进行判断。

(1)如果REQUEST

[cusneed]

[i]<=

NEED[cusneed][i],则转(2);否则,出错。

(2)如果REQUEST

[cusneed]

[i]<=

AVAILABLE[cusneed][i],则转(3);否则,出错。

银行家算法的数据结构

假设有M个进程N类资源,则有如下数据结构:

#define

W

#define

R

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];

//请求资源个数

3.“安全性检测“算法

1)先定义两个变量,用来表示推算过程的数据.F[n]=A[n],表示推算过程中,系统中剩余资源量的变化.J[n]=False表示推算过程中各进程是否假设“已完成“

系统试探分配资源,修改相关数据:

AVAILABLE[i]-=REQUEST[cusneed][i];

ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];、NEED[cusneed][i]-=REQUEST[cusneed][i];

4、安全性检查算法

1)设置两个工作向量Work=AVAILABLE;FINISH

2)从进程集合中找到一个满足下述条件的进程,FINISH==false;

NEED<=Work;

如找到,执行(3);否则,执行(4)

3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

Work+=ALLOCATION;

Finish=true;

GOTO

4)如所有的进程Finish=

true,则表示安全;否则系统不安全。

安全状态:

在某时刻系统中所有进程可以排列一个安全序列:{P1,P2,`````Pn},刚称此时,系统是安全的.所谓安全序列{P1,P2,`````Pn}是指对于P2,都有它所需要剩余资源数量不大于系统掌握的剩余的空间资源与所有Pi(j

最大需求

尚需

P1

P2

P3

4             2

在每一次进程中申请的资源,判定一下,若实际分配的话,之后系统是否安全.银行家算法的数据结构.五、代码清单

#include

#include

#include

#include

#include

#include

const

int

MAX_P=20;

const

int

MAXA=10;

//定义A类资源的数量

const

int

MAXB=5;

const

int

MAXC=7;

typedef

struct

node{

int

a;

int

b;

int

c;

int

remain_a;

int

remain_b;

int

remain_c;

}bank;

typedef

struct

node1{

char

name[20];

int

a;

int

b;

int

c;

int

need_a;

int

need_b;

int

need_c;

}process;

bank

banker;

process

processes[MAX_P];

int

quantity;

//初始化函数

void

initial()

{

int

i;

banker.a=MAXA;

banker.b=MAXB;

banker.c=MAXC;

banker.remain_a=MAXA;

banker.remain_b=MAXB;

banker.remain_c=MAXC;

for(i=0;i

strcpy(processes[i].name,““);

processes[i].a=0;

processes[i].b=0;

processes[i].c=0;

processes[i].need_a=0;

processes[i].need_b=0;

processes[i].need_c=0;

}

}

//新加作业

void

add()

{

char

name[20];

int

flag=0;

int

t;

int

need_a,need_b,need_c;

int

i;

cout<

cout<<“新加作业“<

cout<<“请输入新加作业名:“;

cin>>name;

for(i=0;i

if(!strcmp(processes[i].name,name)){

flag=1;

break;

}

}

if(flag){

cout<<“错误,作业已存在“<

}

else{

cout<<“本作业所需A类资源:“;

cin>>need_a;

cout<<“本作业所需B类资源:“;

cin>>need_b;

cout<<“本作业所需C类资源:“;

cin>>need_c;

t=1;

cout<

if(need_a>banker.remain_a){

cout<<“错误,所需A类资源大于银行家所剩A类资源“<

t=0;

}

if(need_b>banker.remain_b){

cout<<“错误,所需B类资源大于银行家所剩B类资源“<

t=0;

}

if(need_c>banker.remain_c){

cout<<“错误,所需C类资源大于银行家所剩C类资源“<

t=0;

}

if(t){

strcpy(processes[quantity].name,name);

processes[quantity].need_a=need_a;

processes[quantity].need_b=need_b;

processes[quantity].need_c=need_c;

quantity++;

cout<<“新加作业成功“<

}

else{

cout<<“新加作业失败“<

}

}

}

//为作业申请资源

void

bid()

{

char

name[20];

int

i,p;

int

a,b,c;

int

flag;

cout<

cout<<“要申请资源的作业名:“;

cin>>name;

p=-1;

for(i=0;i

if(!strcmp(processes[i].name,name)){

p=i;

break;

}

}

if(p!=-1){

cout<<“该作业要申请A类资源数量:“;

cin>>a;

cout<<“该作业要申请B类资源数量:“;

cin>>b;

cout<<“该作业要申请C类资源数量:“;

cin>>c;

flag=1;

if((a>banker.remain_a)||(a>processes[p].need_a-processes[p].a)){

cout<<“错误,所申请A类资源大于银行家所剩A类资源或该进程还需数量“<

flag=0;

}

if((b>banker.remain_b)||(b>processes[p].need_b-processes[p].b)){

cout<<“错误,所申请B类资源大于银行家所剩B类资源或该进程还需数量“<

flag=0;

}

if((c>banker.remain_c)||(c>processes[p].need_c-processes[p].c)){

cout<<“错误,所申请C类资源大于银行家所剩C类资源或该进程还需数量“<

flag=0;

}

if(flag){

banker.remain_a-=a;

banker.remain_b-=b;

banker.remain_c-=c;

processes[p].a+=a;

processes[p].b+=b;

processes[p].c+=c;

cout<<“为作业申请资源成功“<

}

else{

cout<<“为作业申请资源失败“<

}

}

else{

cout<<“该作业不存在“<

}

}

//撤消作业

void

finished()

{

char

name[20];

int

i,p;

cout<

cout<<“要撤消作业名:“;

cin>>name;

p=-1;

for(i=0;i

if(!strcmp(processes[i].name,name)){

p=i;

break;

}

}

if(p!=-1){

banker.remain_a+=processes[p].a;

banker.remain_b+=processes[p].b;

banker.remain_c+=processes[p].c;

for(i=p;i

processes[i]=processes[i+1];

}

strcpy(processes[quantity-1].name,““);

processes[quantity-1].a=0;

processes[quantity-1].b=0;

processes[quantity-1].c=0;

processes[quantity-1].need_a=0;

processes[quantity-1].need_b=0;

processes[quantity-1].need_c=0;

quantity--;

cout<<“撤消作业成功“<

}

else{

cout<<“撤消作业失败“<

}

}

//查看资源情况

void

view()

{

int

i;

cout<

cout<<“银行家所剩资源(剩余资源/总共资源)“<

cout<<“A类:“<

cout<<“

B类:“<

cout<<“

C类:“<

cout<

if(quantity>0){

for(i=0;i

cout<<“作业名:“<

cout<<“A类:“<

cout<<“

B类:“<

cout<<“

C类:“<

cout<

}

}

else{

cout<<“当前没有作业“<

}

}

//显示版权信息函数

void

version()

{

cout<

cout<<“

银行家算法

“<

cout<

}

void

main()

{

int

chioce;

int

flag=1;

initial();

version();

while(flag){

cout<<“1.新加作业

2.为作业申请资源

3.撤消作业“<

cout<<“4.查看资源情况

0.退出系统“<

cout<<“请选择:“;

cin>>chioce;

switch(chioce){

case

1:

add();

break;

case

2:

bid();

break;

case

3:

finished();

break;

case

4:

view();

break;

case

0:

flag=0;

break;

default:

cout<<“选择错误“<

}

}

}

六、使用说明

运行环境C-FREE4.0,新建任务。将编制好的代码输入此运行环境中。

按F5:出现如上图所示窗口。按照提示,新建一个作业:wujun。为作业分配资源,A:3;B:4;C:5。输入2,为作业分配资源。三种资源的数量分配分别为:A:3;B:5;C:4。输入4,查看资源情况。出现出错提示,所申请的B类资源超过银行家所剩B类资源或作业申请资源失败。输入0,退出系统。

重新加入一个作业:wujun1.并为作业分配资源分别为A:3;B:3;C:3,为该作业分配资源A:3;B:2;C:2.输入4查看资源情况。

显示输出,银行家算法所剩资源(剩余资源、总共资源)。

七、实验心得

八、参考文献

汤子瀛等.计算机操作系统.西安电子科技大学出版社.2001年5月

蒋静

徐志伟.操作系统原理•技术与编程『M』.北京:机械工业出版社,2004

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

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

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

    《计算机操作系统》 课 程 设 计 报 告 题 目: 银行家算法班 级: XXXXXXXXXXXXXXXX 姓 名: XXM 学 号: XXXXXXXXXXXX 指导老师: XXXXXXXXXXXXXX 设计时间: XXXXXXXXXXXXXXX......

    操作系统课程设计编程序模拟银行家算法

    课程设计报告书课程名称:操作系统原理题目:编程序模拟银行家算法系名:信息工程系专业班级:软件姓名:学号:指导教师:2013年X月X日学院信息工程系课程设计任务书课程名称:操作系统原......

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

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

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

    操作系统课程设计报告专业计算机科学与技术学生姓名班级学号指导教师完成日期信息工程学院题目:银行家算法的模拟实现一、设计目的本课程设计是学习完“操作系统原理”课程后......

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

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

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

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

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

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

    操作系统课程设计六种算法

    《计算机操作系统》 学号:班级:软技姓名:张靖伟 课 程 设 计 报 告 4班 1367003270 目录 1 实验:进程调度算法——时间片轮转算法 2 实验:银行家算法3 实验:分区分配算法——4......