搜档网
当前位置:搜档网 › 银行家算法C++代码实现

银行家算法C++代码实现

银行家算法C++代码实现
银行家算法C++代码实现

编号:

武汉大学计算机学院

课程实验(设计)报告

专业(班):计算机科学与技术计科6班

学号:2013301500217

姓名:张伟

课程名称:操作系统设计

任课教师:宋伟

2015年12 月22日

银行家算法实现

一、实习内容

编写实现银行家算法,实现资源的安全分配。

通过本实验熟悉银行家算法,对预防死锁有更深刻的认识。

二、实习题目

初始状态下,设置数据结构存储可利用资源向量(Available),最大需求矩阵(MAX),分配矩阵(Allocation),需求矩阵(Need),输入待分配进程队列和所需资源。

设计安全性算法,设置工作向量表示系统可提供进程继续运行的可利用资源数目。

如果进程队列可以顺利执行打印输出资源分配情况,如果进程队列不能顺利执行打印输出分配过程,提示出现死锁位置。

三、设计思想

数据结构

class process //定义进程

{

public :

bool finish = false; //完成状态

int need[max_resources]; //还需要分配的资源

int allocation[max_resources]; //已经分配的资源

int max_need[max_resources]; //最大需求量

int request[max_resources]; //本次需求量

public:

process(int_need[max_resources], int_allocation[max_resources], int_max_need[max_resources]) {

for (int i = 0; i < max_resources; i++)

{

need[i] = _need[i];

allocation[i] = _allocation[i];

max_need[i] = _max_need[i];

}

}

//构造函数

void set(int_need[max_resources], int_max_need[max_resources])

{

for (int i = 0; i < max_resources; i++)

{

need[i] = _need[i];

allocation[i] = 0;

max_need[i] = _max_need[i];

}

} //赋值函数

process()

{

}

};

主要函数

(1)bool check_safe(int work[max_process], process my_process[max_process])

//安全性算法

(2)bool destribute(int available[max_resources], process the_process, process

my_process[max_process]) //是否分配空间成功的算法

(3) void init(int available[max_resources], process my_process[max_process]) //初始化函数

Main函数

int main()

{

int_need[max_resources];

int _allocation[max_resources];

int available[max_resources];

process my_process[max_process];

int i,j;

int choice=1;

init( available, my_process);

while (true)

{

cout <<" 选项\n 1:继续分配\n 2:查看当前available资源数\n其他字符:退出\n";

scanf_s("%d", &choice);

switch (choice)

{ case 1:

{

cout <<"请输入本次请求分配给第i个进程的资源,格式:进程号xx xx xx xx,空格隔开"<< endl;

scanf_s("%d", &i);

for (j = 0; j < max_resources; j++)

{

scanf_s("%d", &my_process[i].request[j]);

}

if (destribute(available, my_process[i], my_process) == true)

{

cout <<"此次destribute成功"<< endl;

}

else cout <<"此次destribute不成功"<< endl;

}

break;

case 2:

{ for (i = 0; i < max_resources; i++)

cout <<"第"<< i <<"个资源还剩"<< available[i] <<"个\n";

break;

}

default: break;

}

}

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

return 0;

}银行家算法操作部分

银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。

设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。 (1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出错。

(2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],则转(3);否则,出错。

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

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

ALLOCATION[cusneed][i]+=REQUEST[cusneed][i]; NEED[cusneed][i]-=REQUEST[cus need][i];

(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原

状,进程等待。

安全性算法检验部分

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

FINISH==false; NEED<=Work;

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

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

Work+=ALLOCATION; Finish=true; GOTO 2

(4)如所有的进程Finish= true,则表示安全;否则系统不安全。

结果显示部分

在屏幕上面打印本次分配资源是否成功或者失败

或者打印当前available资源状态

四、源代码

/*C++ Source File*/

/*开发环境为Microsoft Visual Studio 2015*/

#include

using namespace std;

#define max_process 5

#define max_resources 4

class process

{

public :

bool finish = false; //完成状态

int need[max_resources]; //还需要分配的资源

int allocation[max_resources]; //已经分配的资源

int max_need[max_resources]; //最大需求量

int request[max_resources]; //本次需求量

public:

process(int_need[max_resources], int_allocation[max_resources], int_max_need[max_resources]) {

for (int i = 0; i < max_resources; i++)

{

need[i] = _need[i];

allocation[i] = _allocation[i];

max_need[i] = _max_need[i];

}

}

//构造函数

void set(bool_finish, int_need[max_resources], int_allocation[max_resources], int

_max_need[max_resources],int_request[max_resources])

{

for (int i = 0; i < max_resources; i++)

{

finish = _finish;

need[i] = _need[i];

allocation[i] = _allocation[i];

max_need[i] = _max_need[i];

request[i] = _request[i];

}

} //赋值函数

process()

{

}

};

bool check_safe(int work[max_process], process my_process[max_process]) //安全性算法

{

int temp_work[max_process];

process temp_process[max_process];

for (int no = 0; no < max_process; no++)

{

temp_work[no] = work[no];

temp_process[no].set(my_process[no].finish, my_process[no].need, my_process[no].allocation, my_process[no].max_need, my_process[no].request);

} //先把每个进程的状态存储在临时数组,最后在拷贝回去

int i = 0;

int x = 0;

bool check_everyone[max_process] = { true ,true,true,true,true};

bool check = false;

int num = 0;

while (check == false&&num

{

num++;

for (i = 0; i < max_process; i++) //找到一个可以完成的资源

{

for ( x = 0; x < max_resources; x++) //对于每个进程,检查资源是否够

{

if (my_process[i].finish == false)

{

check_everyone[i] = work[x] >= my_process[i].need[x];

}

else break;

if (check_everyone[i] == false)

break;

}

if (check_everyone[i] == true)

{ /*先把资源分配给i进程,然后运行完后释放掉*/

for (x = 0; x < max_resources; x++)

{

work[x] = work[x] + my_process[i].need[x];

}

break;

}

}

/*检查是否所有的进程都为true,如果是,那么check置为true*/

for (int temp = 0; temp < max_process; temp++)

{

if (check_everyone[temp] == false)

{

check = false; break;

}

else check = true;

}

/*cout << "check" << endl;*/

}

for (int no = 0; no < max_process; no++)

{

work[no] = temp_work[no];

my_process[no].set(temp_process[no].finish, temp_process[no].need,

temp_process[no].allocation, temp_process[no].max_need, temp_process[no].request);

} //安全性算法检测完毕,把数据拷贝回来

return check;

}

bool destribute(int available[max_resources], process the_process, process my_process[max_process]) { //是否分配成功的算法

int i = 0;

int enough = 1;

for (i = 0; i < max_resources; i++)

{

if (the_process.request[i] <= the_process.need[i] && the_process.request[i] < available[i]) enough = enough * 1;

else enough = 0;

} //检查request的值是不是小于need和available

if (enough > 0)

{

for (i = 0; i < max_resources; i++)

{

available[i] = available[i] - the_process.request[i];

the_process.allocation[i] = the_process.allocation[i] + the_process.request[i];

the_process.need[i] = the_process.need[i] - the_process.request[i];

}

}

else

{

cout <<"请求资源超过宣布最大值或者资源不足,无法分配"<< endl;

return false;

}

if (check_safe(available, my_process) == true)

{

cout <<"此次分配成功"<< endl;

return true;

}

else

{

cout <<"此次寻找失败"<< endl;

for (i = 0; i < max_resources; i++)

{

available[i] = available[i] + the_process.request[i];

the_process.allocation[i] = the_process.allocation[i] - the_process.request[i];

the_process.need[i] = the_process.need[i] + the_process.request[i];

}

the_process.finish = false; //安全性算法检测错误,则回档

return false;

}

}

void init(int available[max_resources], process my_process[max_process]) //初始化函数

{

int _max_need[max_resources];

int i;

int temp[max_resources] = { 0,0,0,0 };

cout <<"初始化available数组值,请输入"<

for ( i = 0; i < max_resources; i++)

{

scanf_s("%d", &available[i]);

}

for (i = 0; i < max_process; i++)

{

cout <<"进程初始化"<< endl;

cout <<"请输入第"<< i <<"个进程的最大所需每个资源的值,共计"<

for (int j = 0; j < max_resources; j++)

{

scanf_s("%d", &_max_need[j]);

}

my_process[i].set(false, _max_need, temp, _max_need,temp);

}

}

int main()

{

int_need[max_resources];

int _allocation[max_resources];

int available[max_resources];

process my_process[max_process];

int i,j;

int choice=1;

init( available, my_process);

while (true)

{

cout <<" 选项\n 1:继续分配\n 2:查看当前available资源数\n其他字符:退出\n";

scanf_s("%d", &choice);

switch (choice)

{ case 1:

{

cout <<"请输入本次请求分配给第i个进程的资源,格式:进程号xx xx xx xx,空格隔开"<< endl;

scanf_s("%d", &i);

for (j = 0; j < max_resources; j++)

{

scanf_s("%d", &my_process[i].request[j]);

}

if (destribute(available, my_process[i], my_process) == true)

{

cout <<"此次destribute成功"<< endl;

}

else cout <<"此次destribute不成功"<< endl;

}

break;

case 2:

{ for (i = 0; i < max_resources; i++)

cout <<"第"<< i <<"个资源还剩"<< available[i] <<"个\n";

break;

}

default: break;

}

}

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

return 0;

}

五、运行实例

为了便于模拟,默认是5个进程,4个公共资源

首先是available资源的初始化(如图1 )

图1

初始化每个进程对于每个资源的max_need值

图2

开始进行资源分配:

此数据设计为可以成功的数据:

图3

图4

查看下剩余的available值

接下来测试一些非法数据:

如图,为request>need值的报错

图5

这是request>available值的时候报错:

图6

接下来再次进行分配:

可见并未通过安全性算法,显示失败

图7

六、心得与体会

通过本次实验,我通过亲身实践实现了模拟银行家算法的实现来预防进程死锁,本次实验需要考虑很周全,我在编程的过程中出现了不少错误,由于考虑不周,刚开始总是顾此失彼,在经过系统的排查错误和对流程的分析,最终一个一个排除错误,

得到正确的银行家算法的代码实现。

用银行家算法实现资源分配

南通大学 杏林学院 操作系统实验(用银行家算法实现资源分配)班级:计121 小组成员:方筱雯1213023008 周徐莲1213023014 指导老师:丁卫平

一:实验目的 为了了解系统的资源分配情况,假定系统的任何一种资源在任一时刻只能被一个进程使用。任何资源已经占用的资源只能由自己释放,而不能由其他进程抢占。当进程申请的资源不能满足时,必须等待。因此,只要资源分配算法能保证进程的资源请求,且不出现循环等待,则系统不会出现死锁。 编写模拟系统进行资源调度的程序,采用银行家算法,有效的避免死锁的产生。模拟进程的分配算法,了解死锁的产生和避免的办法。二:实验要求 (1):为了观察死锁产生和避免的情况,要求设计3到4个并发进程,共享系统的10个同类不可抢占的资源。各进程是动态进行资源的申请和释放。 (2):用银行家算法设计一个资源分配程序,运行这个程序,观察系统运行情况,并对系统运行的每一步进行显示。三:实验流程图

四:源程序 #include #include #include #include #define MaxNumber 100 //定义进程控制块 struct Process_struct{ int Available[MaxNumber]; //可利用资源数组 int Max[MaxNumber][MaxNumber]; //最大需求矩陈 int Allocation[MaxNumber][MaxNumber]; //分配矩陈 int Need[MaxNumber][MaxNumber]; //需求矩陈 int Request[MaxNumber][MaxNumber]; //M个进程还需要N类资源的资源量 int Finish[MaxNumber]; int p[MaxNumber]; }Process; int M,N; //M个进程,N类资源 int i,j,k,l=0; int Work[MaxNumber]; //可利用资源 int Pinput(); int Safe(); int Peques(); //进程输入 int Pinput() { int i,j; cout<<"输入进程的数目:\n"; cin>>M; cout<<"输入资源的种类:\n"; cin>>N; cout<<"输入每个进程最多所需的各类资源数,按照"<>Process.Max[i][j]; cout<<"输入每个进程已经分配的各类资源数,按照"<

银行家算法代码c语言编写

#define M 100 #include int max[M][M],allocation[M][M],need[M][M],available[M]; int i,j,n,m,r; void testout() //算法安全性的检测 { int k,flag,v=0; int work[M],a[M]; char finish[M]; r=1; for(i=0;i0) { for (i=0;iwork[j]) flag=0; if (flag==1) //找到还没完成的且需求数小于可提供进程继续运行的 { finish[i]='T'; //资源数的进程 a[v++]=i; //记录安全序列 for (j=0;j

银行家算法报告和代码

1
课程设计(论文)
题 目: 银行家算法 院 (系): 信息与控制工程系 专业班级: 姓 名: 学 号: 指导教师:
2016 年 1 月 15 日
页脚内容 16

1
西安建筑科技大学华清学院课程设计(论文)任务书
专业班级: 学生姓名:
指导教师(签名):
一、课程设计(论文)题目
银行家算法:设计一个 n 个并发进程共享 m 个系统资源的程序以实现银行家算法。
二、本次课程设计(论文)应达到的目的
操作系统课程实践性比较强。课程设计是加强学生实践能力的一个强有力手段。课程设计要求学 生在完成程序设计的同时能够写出比较规范的设计报告。严格实施课程设计这一环节,对于学生基本 程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。
本题目要达到目的:了解多道程序系统中,多个进程并发执行的资源分配。掌握银行家算法,了 解资源在进程并发执行中的资源分配情况。掌握预防死锁的方法,系统安全状态的基本概念。
三、本次课程设计(论文)任务的主要内容和要求(包括原始数据、技术参 数、设计要求等)
要求: 1)能显示当前系统资源的占用和剩余情况。 2)为进程分配资源,如果进程要求的资源大于系统剩余的资源,不与分配并且提示分配不成功; 3)撤销作业,释放资源。 编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法, 有效地防止和避免死锁的发生。 银行家算法分配资源的原则是:系统掌握每个进程对资源的最大需求量,当进程要求申请资源时, 系统就测试该进程尚需资源的最大量,如果系统中现存的资源数大于或等于该进程尚需求资源最大量 时,就满足进程的当前申请。这样就可以保证至少有一个进程可能得到全部资源而执行到结束,然后 归还它所占有的全部资源供其它进程使用。
四、应收集的资料及主要参考文献:
操作系统经典算法的编程实现资料非常丰富,可以在图书馆找书籍或在因特网上找资料,都很容 易找到,但是大部分代码是不全的,不能直接运行,希望大家只是把它当参考,编码还是自己做。
参考文献: 【1】汤小丹、梁红兵、哲凤屏、汤子瀛 编著.计算机操作系统(第三版).西安:西 安电子科技大学出版社,2007.5 【2】史美林编.计算机操作系统教程.北京:清华大学出版社,1999.11 【3】徐甲同编著.操作系统教程.西安:西安电子科技大学出版社,1996.8 【4】Clifford,A.Shaffer 编著.数决结构与算法分析(C++版).北京:电子工业出版 社,2005.7 【5】蒋立翔编著.C++程序设计技能百练.北京:中国铁道出版社,2004.1
五、审核批准意见
教研室主任(签字)
1 页脚内容

《银行家算法的模拟实现》—实验报告

《银行家算法的模拟实现》 --实验报告 题目: 银行家算法的模拟实现 专业: 班级: 组员: 指导老师:

一、实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。 二、实验内容 模拟实现银行家算法实现死锁避免。要求:初始数据(如系统在T0时刻的资源分配情况、每一种资源的总数量)从文本文件读入,文件中给出最大需求矩阵Max、分配矩阵Allocation,在程序中求得需求矩阵Need和可利用资源向量Available。 三、实验分析过程 1、整个银行家算法的思路。 先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。 1)进程一开始向系统提出最大需求量. 2)进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量. 3)若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的 剩余资源量,若不超出,则分配,否则等待 2、算法用到的主要数据结构和C语言说明。 (1)、可利用资源向量INT A V AILABLE[M] M为资源的类型。 (2)、最大需求矩阵INT MAX[N][M] N为进程的数量。 (3)、已分配矩阵INT ALLOCA TION[N][M] (4)、还需求矩阵INT NEED[N][N] (5)、申请各类资源数量int Request[x]; // (6)、工作向量int Work[x]; (7)、int Finish[y]; //表示系统是否有足够的资源分配给进程,0为否,非0为是 3、银行家算法(主程序) (1)、系统初始化。输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等 (2)、输入用户的请求三元组(I,J,K),为进程I申请K个J类资源。 (3)、检查用户的请求是否小于还需求的数量,条件是K<=NEED[I,J]。如果条件不符则提示重新输入,即不允许索取大于需求量 (4)、检查用户的请求是否小于系统中的可利用资源数量,条件是K<=A V ALIABLE[I,J]。 如果条件不符则申请失败,阻塞该进程,重新进行进程动态资源申请(使用goto语句) (5)、进行资源的预分配,语句如下: A V ALIBLE[I][J]= A V ALIBLE[I][J]-K; ALLOCATION[I][J]= ALLOCATION[I][J]+K; NEED[I][J]=NEED[I][J]-K;

(完整word版)操作系统 银行家算法

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

第一章引言 1.1 课程设计目地: 操作系统是计算机系统的核心系统软件,它负责控制和管理整个系统的资源并组织用户协调使用这些资源,使计算机高效的工作。课程设计的目的是综合应用学生所学知识,通过实验环节,加深学生对操作系统基本原理和工作过程的理解,提高学生独立分析问题、解决问题的能力,增强学生的动手能力。 第二章银行家算法描述 2.1 银行家算法简介: 银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。 要解释银行家算法,必须先解释操作系统安全状态和不安全状态。 安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。 不安全状态:不存在一个安全序列。不安全状态不一定导致死锁。 那么什么是安全序列呢? 安全序列:一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。 2.2 银行家算法描述: 我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当

前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。 2.3银行家算法原理 2.3.1银行家算法的思路 先对用户提出的请求进行合法性检查,即检查请求的是不大于需要的,是否不大于可利用的。若请求合法,则进行试分配。最后对试分配后的状态调用安全性检查算法进行安全性检查。若安全,则分配,否则,不分配,恢复原来状态,拒绝申请。 2.3.2 银行家算法中用到的主要数据结构 可利用资源向量 int Available[j] j为资源的种类。 最大需求矩阵 int Max[i][j] i为进程的数量。 分配矩阵 int Allocation[i][j] 需求矩阵 int need[i][j]= Max[i][j]- Allocation[i][j] 申请各类资源数量 int Request i[j] i进程申请j资源的数量 工作向量 int Work[x] int Finish[y] 2.3.3 银行家算法bank() 进程i发出请求申请k个j资源,Request i[j]=k (1)检查申请量是否不大于需求量:Request i[j]<=need[i,j],若条件不符重新

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

操作系统课程设计 (银行家算法的模拟实现) 一、设计目的 1、进一步了解进程的并发执行。 2、加强对进程死锁的理解。 3、用银行家算法完成死锁检测。 二、设计内容 给出进程需求矩阵C、资源向量R以及一个进程的申请序列。使用进程启动拒绝和资源分配拒绝(银行家算法)模拟该进程组的执行情况。 三、设计要求 1、初始状态没有进程启动。 2、计算每次进程申请是否分配,如:计算出预分配后的状态情况(安全状态、不安全状态),如果是安全状态,输出安全序列。 3、每次进程申请被允许后,输出资源分配矩阵A和可用资源向量V。 4、每次申请情况应可单步查看,如:输入一个空格,继续下个申请。 四、算法原理 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、银行家算法应用 模拟实现Dijkstra的银行家算法以避免死锁的出现,分两部分组成:一是银行家算法(扫描);二是安全性算法。 (1)银行家算法(扫描) 设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Ri类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查: ①如果Requesti[j]<=Need[i,j],便转向步骤②;否则认为出错,

编程序模拟银行家算法

武汉理工大学华夏学院课程设计报告书 课程名称:操作系统原理 题目:编程序模拟银行家算法 系名:信息工程系 专业班级:软件1121 姓名:钟伟 学号:10212812120 指导教师:苏永红 2014年 6 月13 日

武汉理工大学华夏学院信息工程系 课程设计任务书 课程名称:操作系统原理课程设计指导教师:苏永红 班级名称:软件1121 开课系、教研室:软件与信息安全 一、课程设计目的与任务 操作系统课程设计是《操作系统原理》课程的后续实践课程,旨在通过一周的实践训练,加深学生对理论课程中操作系统概念,原理和方法的理解,加强学生综合运用操作系统原理、Linux系统、C语言程序设计技术进行实际问题处理的能力,进一步提高学生进行分析问题 和解决问题的能力,包含系统分析、系统设计、系统实现和系统测试的能力。 学生将在指导老师的指导下,完成从需求分析,系统设计,编码到测试的全过程。 二、课程设计的内容与基本要求 1、课程设计题目 编程序模拟银行家算法 2、课程设计内容 本课程设计要求在Linux操作系统,GCC编译环境下开发。 银行家算法是避免死锁的一种重要方法,本实验要求用用c/c++语言在Linux操作系统 环境下编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 思想:将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不超过现存 资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。银行家 对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借 款后能在有限的时间内归还。用银行家算法分配资源时,测试进程对资源的最大需求量,若 现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个 进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限 的时间内得到所需资源则称系统处于安全状态。 3、设计报告撰写格式要求: 1设计题目与要求 2 设计思想 3系统结构 4 数据结构的说明和模块的算法流程图 5 使用说明书(即用户手册):内容包含如何登录、退出、读、写等操作说明 6 运行结果和结果分析(其中包括实验的检查结果、程序的运行情况) 7 自我评价与总结 8 附录:程序清单,注意加注释(包括关键字、方法、变量等),在每个模块前加注释;

银行家算法的实现

实验四银行家算法的实现 1、实验目的 通过编写和调试银行家算法的模拟程序以加深对避免死锁方案的理解。熟悉银行家算法的分配思想。 2、实验要求 设计一个银行家方案。并编写模拟程序实现之。已知系统总共的资源数、进程名、进程已分配的资源、进程运行完毕最大最资源的需求量,以书上例题为例,分析某一时刻系统的安全状态,如果安全,输出安全序列。 3、算法描述 银行家算法中数据结构如下: n :系统中的进程个数; m :系统中的资源类数。 1)Available(m):现有资源向量。 Available(j)=k表示k个未分配的j类资源 2)Max(n,m):资源最大申请量矩阵。 Max(i,j)=k表示第i个进程在运行过程中对第j类资源的最大申请量为k。 3)Allocation(n,m):资源分配矩阵。 Allocation(i,j)=k表示进程i已占有k个j类资源。 4)Need(n,m):进程以后还需要的资源矩阵。 Need(i,j)=k表示进程i以后还需要k个第j类资源。 显然有Need[i,j]=Max[i,j]-Allocation[i,j]。 5)Request(n,m):进程申请资源矩阵。 Request(i,j)=k表示进程i申请k个第j类资源。 银行家算法思想如下: 若进程i申请资源,申请资源向量为Request(i),则有如下资源分配过程: 1)如果Request(i)〉Need(i),则报错返回。 2)如果Request(i)〉Avaliable,则进程i进入等待资源状态,返回。 3)假设进程进程i的申请已获批准,于是修改系统状态: Avaliable=Avaliable-Request(i) Allocation(i)=Allocation(i)+Request(i) Need(i)=Need(i)-Request(i) 4)调用安全状态检查算法。 设Work(m)为临时工作向量。初始时Work=Available。令N={1,2,……n}。 寻求j∈N 使其满足:Need(j)<=Work,若不存在这样的j则转至3)。 Work=Work+Allocation(j)N=N-{j} 转至1)。 如果N=空集则返回(系统安全)。如果N≠空集则返回(系统不安全)。 5)若系统处于安全状态,则将进程i申请的资源分配给进程i,返回。 6)若系统处于不安全状态,则不将进程i申请的资源分配给进程i,恢复原来的资源分配状态,让进程i等待。 Avaliable = Avaliable + Request(i) Allocation(i)=Allocation(i)-Request(i) Need(i)=Need(i)+ Request(i) 4、源程序代码

银行家算法报告和代码

课程设计(论文) 题目:银行家算法 院(系):信息与控制工程系专业班级: 姓名: 学号: 指导教师: 2016年1 月15日

西安建筑科技大学华清学院课程设计(论文)任务书 专业班级:学生姓名:指导教师(签名): 一、课程设计(论文)题目 银行家算法:设计一个n个并发进程共享m个系统资源的程序以实现银行家算法。 二、本次课程设计(论文)应达到的目的 操作系统课程实践性比较强。课程设计是加强学生实践能力的一个强有力手段。课程设计要求学生在完成程序设计的同时能够写出比较规范的设计报告。严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。 本题目要达到目的:了解多道程序系统中,多个进程并发执行的资源分配。掌握银行家算法,了解资源在进程并发执行中的资源分配情况。掌握预防死锁的方法,系统安全状态的基本概念。 三、本次课程设计(论文)任务的主要内容和要求(包括原始数据、技术参数、设计要求等) 要求: 1)能显示当前系统资源的占用和剩余情况。 2)为进程分配资源,如果进程要求的资源大于系统剩余的资源,不与分配并且提示分配不成功; 3)撤销作业,释放资源。 编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁的发生。 银行家算法分配资源的原则是:系统掌握每个进程对资源的最大需求量,当进程要求申请资源时,系统就测试该进程尚需资源的最大量,如果系统中现存的资源数大于或等于该进程尚需求资源最大量时,就满足进程的当前申请。这样就可以保证至少有一个进程可能得到全部资源而执行到结束,然后归还它所占有的全部资源供其它进程使用。 四、应收集的资料及主要参考文献: 操作系统经典算法的编程实现资料非常丰富,可以在图书馆找书籍或在因特网上找资料,都很容易找到,但是大部分代码是不全的,不能直接运行,希望大家只是把它当参考,编码还是自己做。 参考文献: 【1】汤小丹、梁红兵、哲凤屏、汤子瀛编著.计算机操作系统(第三版).西安:西安电子科技大学出版社,2007.5 【2】史美林编.计算机操作系统教程.北京:清华大学出版社,1999.11 【3】徐甲同编著.操作系统教程.西安:西安电子科技大学出版社,1996.8 【4】Clifford,A.Shaffer编著.数决结构与算法分析(C++版).北京:电子工业出版社,2005.7 【5】蒋立翔编著.C++程序设计技能百练.北京:中国铁道出版社,2004.1 五、审核批准意见 教研室主任(签字)

1银行家算法是一种算法

习题二 一选择题 1.银行家算法是一种___算法。 A.死锁解除B.死锁避免 C.死锁预防D.死锁检测 2.在下列解决死锁的方法中,属于死锁预防策略的是___。 A.银行家算法 B.资源有序分配法 C.死锁检测法 D.资源分配图化简法 3.在为多道程序所提供的可共享的系统资源不足时,可能出现死锁。但是,不适当的___也可能产生死锁。 A.进程优先权 B.资源的线性分配 C.进程推进顺序 D.分配队列优先权 4.采用资源剥夺法可解除死锁,还可以采用____方法解除死锁。 A.执行并行操作 B.撤消进程 C.拒绝分配新资源 D.修改信号量 5.资源的按序分配可以破坏___条件。 A.互斥使用资源 B.占有且等待资源 C.非抢夺资源 D.循环等待资源 6.在___的情况下,系统出现死锁。 A.计算机系统发生了重大故障 B.有多个封锁的进程同进存在 C.若干进程因竞争资源而无休止地相互等待他方释放已占有的资源 D.资源数大大小于进程数或进程同时申请的资源大大超过资源总数 7.产生死锁的四个必要条件是:互斥、___、循环等待和不剥夺。 A.请求与阻塞 B.请求与保持 C.请求与释放 D.释放与阻塞 8.在分时操作系统中,进程调度经常采用___算法。 A.先来先服务 B.最高优先权 C.时间片轮转 D.随机 9.___优先权是在创建进程时确定的,确定之后在整个进程运行期间不再 改变。 A.先来先服务 B.静态 C.动态 D.短作业 10.某系统中有3个并发进程,都需要同类资源4个,试问该系统不会发生 死锁的最少资源数是___。 A.9 B.10 C.11 D.12 11.支持多道程序设计的操作系统在运行过程中,不断地选择新进程执行来实现CPU的共享,但其中___不是引起操作系统选择新进程的直接原因。 A.执行进程的时间片用完 B.执行进程出错 C.执行进程要等待某一事件发生 D.有新进程进入就绪队列 二综合题 ⒈名词解释: 进程调度、死锁、安全序列、资源分配图、死锁定理、饥饿、鸵鸟算法。 ⒊请解释什么是先来先服务算法、时间片轮转法和优先数优先算法?有什么用途? ⒍何谓静态优先权和动态优先权?确定优先权的依据是什么? ⒎何谓死锁?产生死锁的原因是什么? ⒏什么是产生死锁的必要条件? ⒐预防死锁的有几种方法? 12.如何对资源分配图化简?

银行家算法C++代码

#include #include #include #define False 0 #define True 1 int Max[100][100]={0};//各进程所需各类资源的最大需求 int Avaliable[100]={0};//系统可用资源 char name[100]={0};//资源的名称 int Allocation[100][100]={0};//系统已分配资源 int Need[100][100]={0};//还需要资源 int Request[100]={0};//请求资源向量 int temp[100]={0};//存放安全序列 int Work[100]={0};//存放系统可提供资源 int M;//作业的最大数 int N;//资源的最大数 int Sum[50]={0}; void init() { int i,j,flag; char ming; cout<<"请首先输入系统可供资源种类的数量:"; cin>>N; for(i=0;i>ming; name[i]=ming; cout<<"资源的数量:"; cin>>Sum[i]; } cout<>M; cout<<"请输入各进程的最大需求量("<>Max[i][j]; do{ flag=0; cout<<"请输入各进程已经申请的资源量("<>Allocation[i][j];

银行家算法_实验报告

课程设计报告课程设计名称共享资源分配与银行家算法 系(部) 专业班级 姓名 学号 指导教师 年月日

目录 一、课程设计目的和意义 (3) 二、方案设计及开发过程 (3) 1.课题设计背景 (3) 2.算法描述 (3) 3.数据结构 (4) 4.主要函数说明 (4) 5.算法流程图 (5) 三、调试记录与分析 四、运行结果及说明 (6) 1.执行结果 (6) 2.结果分析 (7) 五、课程设计总结 (8)

一、程设计目的和意义 计算机科学与技术专业学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,其目的在于加深催操作系统基础理论和基本知识的理解,加强学生的动手能力.银行家算法是避免死锁的一种重要方法。通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法 二、方案设计及开发过程 1.课题设计背景 银行家算法又称“资源分配拒绝”法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。这时系统将该进程从进程集合中将其清除。此时系统中的资源就更多了。反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他。请进程等待 2.算法描述 1)如果Request[i] 是进程Pi的请求向量,如果Request[i,j]=K,表示进程Pi 需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查: 如果Requesti[j]<= Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。 2)如果Requesti[j]<=Available[j],便转向步骤3,否则,表示尚无足够资源,进程Pi须等待。 3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值: Available[j]:=Available[j]-Requesti[j]; Allocation[i,j]:=Allocation[i,j]+Requesti[j]; Need[i,j]:=Need[i,j]-Requesti[j];

银行家算法及安全算法

实验名称:银行家算法 实验时间:2015.04.20 实验目的: 1:利用银行家算法避免死锁 2:掌握银行家算法的基本原理 3:掌握安全算法的基本原理实验仪器: PC vc6.0 实验原理: 1:银行家算法的基本原理

2:安全算法的基本原理 实验内容:请使用银行家算法来避免死锁的产生 程序代码:(供参考) #include #include #include #define False 0 #define True 1 int Max[100][100]={0};//各进程所需各类资源的最大需求int Avaliable[100]={0};//系统可用资源

char name[100]={0};//资源的名称 int Allocation[100][100]={0};//系统已分配资源 int Need[100][100]={0};//还需要资源 int Request[100]={0};//请求资源向量 int temp[100]={0};//存放安全序列 int Work[100]={0};//存放系统可提供资源 int M=100;//作业的最大数为100 int N=100;//资源的最大数为100 void showdata()//显示资源矩阵 { int i,j; cout<<"系统目前可用的资源[Avaliable]:"<

银行家算法的java编程实现

/*死锁避免和死锁检测模拟程序【银行家算 法】网络工程06-3班学号:310609040308*/ import java.util.*; public class TestTheBanker { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); TheBanker tb = new TheBanker(); tb.deadlockAvoidance();//死锁避免 int gate = 1; while(gate!=0){ tb.deadlockDetection();//死锁检测 System.out.println("如果您要继续分配资源请输入\"1\",退出请输入\"0\""); System.out.print("您输入的值为:"); gate = scanner.nextInt(); System.out.println(); } System.out.println("使用愉快!期待您下次使用!"); } } class TheBanker{ int m; int n; int[][] max; int[][] maxbak;//备份用 int[][] allocation; int[][] allocationbak;//备份用 int[][] need; int[][] needbak;//备份用 int[] available; int[] availablebak;//备份用 public TheBanker(){ Scanner s = new Scanner(System.in); System.out.println("初始化=============="); System.out.print("请依次输入系统中的【进程数】和【资源类型数】:"); m = s.nextInt(); n = s.nextInt(); max =new int[m][n];

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

操作系统课程设计实验报告用C实现银行家算 法 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

操作系统 实 验 报 告 (2) 学院:计算机科学与技术学院 班级:计091 学号:姓名:

时间:2011/12/30 目录 1.实验名称 (3) 2.实验目的 (3) 3.实验内容 (3) 4.实验要求 (3) 5.实验原理 (3) 6.实验环境 (4) 7.实验设计 (4) 数据结构设计 (4) 算法设计 (6) 功能模块设计 (7) 8.实验运行结果 (8) 9.实验心得 (9) 附录:源代码(部分) (9) 一、实验名称: 用C++实现银行家算法 二、实验目的: 通过自己编程来实现银行家算法,进一步理解银行家算法的概念及含义,提高对银行家算法的认识,同时提高自己的动手实践能力。 各种死锁防止方法能够阻止发生死锁,但必然会降低系统的并发性并导致低效的资源利用率。死锁避免却与此相反,通过合适的资源分配算法确保不会出现进程循环等

待链,从而避免死锁。本实验旨在了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生。 三、实验内容: 利用C++,实现银行家算法 四、实验要求: 1.完成银行家算法的设计 2.设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。 五、实验原理: 系统中的所有进程放入进程集合,在安全状态下系统收到进程的资源请求后,先把资源试探性的分配给它。之后,系统将剩下的可用资源和进程集合中的其他进程还需要的资源数作比较,找出剩余资源能够满足的最大需求量的进程,从而保证进程运行完毕并归还全部资源。这时,把这个进程从进程集合中删除,归还其所占用的所有资源,系统的剩余资源则更多,反复执行上述步骤。最后,检查进程集合,若为空则表明本次申请可行,系统处于安全状态,可以真正执行本次分配,否则,本次资源分配暂不实施,让申请资源的进程等待。 银行家算法是一种最有代表性的避免的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干。要解释银行家算法,必须先解释操作系统安全状态和不安全状态。安全序列是指一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。

实验二 银行家算法模拟

实验二银行家算法模拟 实验学时:2 实验类型:设计 实验要求:必修 一、实验目的 (1)进一步理解利用银行家算法避免死锁的问题; (2)在了解和掌握银行家算法的基础上,编制银行家算法通用程序,将调试结果显示在计算机屏幕上,再检测和笔算的一致性。 (3)理解和掌握安全序列、安全性算法 二、实验内容 (1)了解和理解死锁; (2)理解利用银行家算法避免死锁的原理; (3)会使用某种编程语言。 三、实验原理 (一)安全状态 指系统能按照某种顺序如(称为序列为安全序列),为每个进程分配所需的资源,直至最大需求,使得每个进程都能顺利完成。 (二)银行家算法 假设在进程并发执行时进程i提出请求j类资源k个后,表示为Requesti[j]=k。系统按下述步骤进行安全检查: (1)如果Requesti≤Needi则继续以下检查,否则显示需求申请超出最大需求值的错误。(2)如果Requesti≤Available则继续以下检查,否则显示系统无足够资源,Pi阻塞等待。(3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值: Available[j]∶=Available[j]-Requesti[j]; Allocation[i,j]∶=Allocation[i,j]+Requesti[j]; Need[i,j]∶=Need[i,j]-Requesti[j]; (4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。 (三)安全性算法 (1)设置两个向量: ①工作向量Work: 它表示系统可提供给进程继续运行所需的各类资源数目,它含有m 个元素,在执行安全算法开始时,Work∶=Available; ② Finish: 它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]∶=false; 当有足够资源分配给进程时,再令Finish[i]∶=true。 (2)从进程集合中找到一个能满足下述条件的进程: ① Finish[i]=false;

银行家算法C++代码实现

编号: 武汉大学计算机学院 课程实验(设计)报告 专业(班):计算机科学与技术计科6班 学号:2013301500217 姓名:张伟 课程名称:操作系统设计 任课教师:宋伟 2015年12 月22日

银行家算法实现 一、实习内容 编写实现银行家算法,实现资源的安全分配。 通过本实验熟悉银行家算法,对预防死锁有更深刻的认识。 二、实习题目 初始状态下,设置数据结构存储可利用资源向量(Available),最大需求矩阵(MAX),分配矩阵(Allocation),需求矩阵(Need),输入待分配进程队列和所需资源。 设计安全性算法,设置工作向量表示系统可提供进程继续运行的可利用资源数目。 如果进程队列可以顺利执行打印输出资源分配情况,如果进程队列不能顺利执行打印输出分配过程,提示出现死锁位置。 三、设计思想 数据结构 class process //定义进程 { public : bool finish = false; //完成状态 int need[max_resources]; //还需要分配的资源 int allocation[max_resources]; //已经分配的资源 int max_need[max_resources]; //最大需求量 int request[max_resources]; //本次需求量 public: process(int_need[max_resources], int_allocation[max_resources], int_max_need[max_resources]) { for (int i = 0; i < max_resources; i++) { need[i] = _need[i]; allocation[i] = _allocation[i]; max_need[i] = _max_need[i]; } } //构造函数 void set(int_need[max_resources], int_max_need[max_resources]) { for (int i = 0; i < max_resources; i++) { need[i] = _need[i]; allocation[i] = 0; max_need[i] = _max_need[i]; } } //赋值函数 process()

银行家算法实现资源分配

《操作系统》实验报告 实验二银行家算法实现资源分配 一、实验目的: 在了解和掌握银行家算法的基础上,能熟练的处理课本例题中所给状态的安全性问题。能编制银行家算法通用程序,将调试结果显示在计算机屏幕上,再检测和笔算的一致性。 二、实验内容: 、 用银行家算法判断系统能否将资源分配给它; (2)若进程P3提出请求Request(1,1,2),用银行家算法程序验证系统能否将资源分配给它。 三、实验要求: 本实验要求用高级语言编写和调试一个简单的银行家算法程序。用银行家算法实现资源分配。 四、实验步骤: 数据结构: 1.可利用资源向量Available

2.最大需求矩阵Max 3.分配矩阵Allocation 4.需求矩阵Need 功能介绍: 模拟实现Dijkstra的银行家算法以避免死锁的出现.分两部分组成: 第一部分:银行家算法(扫描) 1.如果Request<=Need,则转向2;否则,出错 2.如果Request<=Available,则转向3,否则等待 3.系统试探分配请求的资源给进程 4.系统执行安全性算法 第二部分:安全性算法 1.设置两个向量 (1).工作向量:Work=Available(表示系统可提供给进程继续运行所需要的各类 资源数目) (2).Finish:表示系统是否有足够资源分配给进程(True:有;False:没有).初始化为 False 2.若Finish[i]=False&&Need<=Work,则执行3;否则执行4(I为资源类别) 3.进程P获得第i类资源,则顺利执行直至完成!并释放资源: Work=Work+Allocation; Finish[i]=true; 转2 4. 若所有进程的Finish[i]=true,则表示系统安全;否则,不安全! 五.程序清单: 编写代码如下: #include #include #define M 5 /*M个进程,N个资源*/ #define N 3 int AVAILABLE[N]; /*可用资源数组*/ int MAX[M][N]; /*最大需求矩阵*/ int ALLOCATION[M][N]; /*分配矩阵*/ int NEED[M][N]; /*需求矩阵*/

相关主题