当前位置:文档之家› 《银行家算法的模拟实现》—实验报告

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

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

题目: 银行家算法的模拟实现

专业:

班级:

组员:

指导老师:

一、实验目的

死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。

二、实验内容

模拟实现银行家算法实现死锁避免。要求:初始数据(如系统在T0时刻的资源分配情况、每一种资源的总数量)从文本文件读入,文件中给出最大需求矩阵Max、分配矩阵Allocation,在程序中求得需求矩阵Need和可利用资源向量Available。

三、实验分析过程

1、整个银行家算法的思路。

先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。

1)进程一开始向系统提出最大需求量.

2)进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量.

3)若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的

剩余资源量,若不超出,则分配,否则等待

2、算法用到的主要数据结构和C语言说明。

(1)、可利用资源向量 INT AVAILABLE[M] M为资源的类型。

(2)、最大需求矩阵 INT MAX[N][M] N为进程的数量。

(3)、已分配矩阵 INT ALLOCATION[N][M]

(4)、还需求矩阵 INT NEED[N][N]

(5)、申请各类资源数量int Request[x]; ."<

cout<<"|-------|------------|-----------|----------|-----------|"<

cout<<"|-------|最大需求矩阵|已分配矩阵-|-需求矩阵-|可利用资源-|"<

cout<<"| 资源 | Max | Allocation| Need | available |"<

cout<<"| | A B C | A B C | A B C | A B C |"<

cout<<"|进程 | | | | |"<

cout<<"|-------|------------|-----------|----------|-----------|"<

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

{

cout<<"| p"<

for(j=0;j<3;j++) {

cout<

cout<<" | ";

for(j=0;j<3;j++) {

cout<<" "<

cout<<" | ";

for(j=0;j<3;j++) {

cout<<" "<

cout<<" |";

if(i==0) {

for(j=0;j<3;j++) {

cout<<" "<

cout<<" |"; }

if(i>0)

{cout<<" |"; }

cout<

cout<<"|-------|------------|-----------|----------|-----------|"<

/*--------试分配函数-------*/

void tryfenpei(int i)

{

for(int f=0;f

{

available[f]=available[f]-request[f];

allocation[i][f]=allocation[i][f]+request[f];

need[i][f]=need[i][f]-request[f];

}

}

/*--------恢复数据函数-------*/

void refenpei(int i)

{

for(int f=0;f

{

available[f]=available[f]+request[f];

allocation[i][f]=allocation[i][f]-request[f];

need[i][f]=need[i][f]+request[f];

}

}

int com(int *p,int *q)

{

int i;

for(i=0;i

if(p[i]>q[i])

return 0;

return 1;

}

/*--------安全检测函数---------*/

void checksafe(int s)

{

int flag,temp[t],i,j,l,k=0;

bool finish[t];

for(i=0;i

finish[i]=false;

for(j=0;j

work[j]=available[j];

cout<<"|-------|-----------------|----------|"<

cout<<"|programme | | |"<

for(i=0;i

{

l=0;

for(j=0;j

{

if(need[i][j]>work[j])

l=1;

break;

}

if(finish[i]==false&&l==0)

{

cout<<"| p"<

for(j=0;j

{

work[j]=work[j]+allocation[i][j];

if(work[j]>9)

cout<<" "<

else

cout<<" "<

}

cout<<" ";

cout<<"|";

cout<<" ";

finish[i]=true;

cout<<"true ";

cout<<"|";

temp[k]=i;."<

refenpei(in);

cout<<"恢复数据成功!正在打印输出..."<

print();

}

else

{

cout<<"找到一个安全系列:";

for(i=0;i

cout<<"P"<";

cout<

cout<<"开始给第"<<"p]"<

cout<<"分配完成!打印输出..."<

print();

cout<

}

}

}

五、程序运行结果及分析

1、运行结果

输入初值,进行安全性测试,结果安全序列,依次为P4-P0-P1-P2-P3分配资源:

资源不足,无法继续实验:

2、出现问题及解决方案

本程序考虑了程序功能实现、格式显示合理化、输入错误异常处理等各个方面的设计,尽可能使程序设计的更加完美。在长期的设计调试过程中遇到过许多问题,通过网上搜索、查询资料、调试试验等方法一一解决。下面大致罗列一些主要问题:

(1)、关于某些判断算法优劣问题:

在程序中很多地方都会用到循环判断是否符合条件的算法,在设计这些算法时有很多方法,而有的算法可以更节省时间。如下安全性算法中寻找寻找符合Finish[i]==0条件的进程的例子:

/* 算法一:

for (j=0; j

if (Work[j]>=Need[i][j]) counter=counter+1;//记数

if(counter==m){…

*/ //算法二:

for (j=0; j

if (Work[j]>=Need[i][j]); //可用大于等于需求

else{

counter=1;

break;

}

if(counter!=1){…

显然算法二要优于算法一。本程序中还有很多类似的地方。这里主要考虑的是一个程序的优化设计问题。

(2)、关于某些系统函数调用时的执行顺序:

在调用一些系统函数如getch() 、system("pause")等时发现其执行顺序的一些问题。如类似:

cout<<" =================================="<

cout<<" \n\n\n"<

system("pause");//暂停

调试时发现此时:在Microsoft Visual C++ 中先执行system("pause") 再输出显示,而在调试器Bloodshed Dev-C++中则顺序执行;但当把cout<<" \n\n\n"<

改为 cout<

查找了一下相关帮助:

在中有这样的一个inline函数:

inline _CRTIMP ostream& __cdecl endl(ostream& _outs) { return _outs << '\n' << flush; }。也就是说

endl= return _outs << '\n' << flush;

endl除了写'\n'进外,还调用flush函数,刷新缓冲区,把缓冲区里的数据写入文件或屏幕。如果考虑效率就用'\n'

(3)、关于设置暂停的方法:

在有些地方需要暂停一下以便于用户查看信息等,总结了下大致可用以下几中方法:

方法一:

#include <>

system("pause");//暂停一下并显示“输入任意键继续…”

方法二:

#include <>

getchar();//须按回车键结束,不是任意键

方法三:

#include <>

getch();//等待键盘输入,不返回任何值,无任何显示

方法四:

使用 char* tt=new char; cin>>tt; 方式,要求键盘输入一个与程序无关的变量

六、心得体会

“银行家算法的模拟实现”是本学期操作系统课程唯一的课程设计。在设计此程序的过程中,我们遇到过许多问题,也学到了很多东西。本程序的设计实现主要是用C++语言实现,通过对程序算法的设计优化、输出显示的格式设计、输入过程中的异常处理等一些设计过程中的问题的考虑解决,在C++学习上也有了很大的进步。程序设计过程中开始遇到的最大的问题是算法的结构设计问题,课本上只给了设计要求及简单的算法,要真正实现还需要考虑很多方面。在算法的数据结构设计上考虑了很长时间。在程序设计中先后参考了很多网络资料,也参考了一些别人写的的程序,综合这些算法思想和自己的思路对程序做了很好的设计方式,对一些算法的优越性等也作了一些考虑。此外考虑最多的就是异常错误处理的设计。一个好的程序必须能在各种环境下都有其相应的处理方式,至少能应对一些常见的可能发生的错误。比如一般的要求输入为数字时,如果输入了一个非数字字符,程序就会立即出错无法继续运行,本程序针对这个问题设计了一个shuzi();函数进行处理,处理方式为:接受键盘输入的字符为字符串,然后对字符串的每个字符进行判断是否为数字,如果有非数字字符出现则提示出错并要求重新输入。又如在判断是否继续时要求输入Y/N时,按一般的方式,如果输入为多个字符,则多余的字符会保存在缓冲区,到下次要求输入时输入而导致出错,对此问题设计处理方式为接受输入字符保存为串然后只取其首字符进行判断。还有很多类似的错误处理。还有在设置程序的显示优化时,发现暂停函数在不同的情况下执行顺序不同,如此等等。

银行家算法实验报告

银行家算法分析、设计与实现 一、设计理论描述 本设计的目的是通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。要求如下: (1)模拟一个银行家算法; (2)初始化时让系统拥有一定的资源; (3)用键盘输入的方式申请资源; (4)如果预分配后,系统处于安全状态,则修改系统的资源分配情况; (5)如果预分配后,系统处于不安全状态,则提示不能满足请求, 设计的主要内容是模拟实现动态资源分配。同时编写和调试一个系统动态资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生。 银行家算法.顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行加资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。在操作系统中研究资源分配策略时也有类似问题,系统

中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。 把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。显然,,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁. 二、算法描述及数据结构模型 1.银行家算法: 设进程i提出请求Request[n],则银行家算法按如下规则进行判断。 (1)如果Request[n]>Need[i,n],则报错返回。 (2)如果Request[n]>Available,则进程i进入等待资源状态,返回。 (3)假设进程i的申请已获批准,于是修改系统状态: Available=Available-Request Allocation=Allocation+Request Need=Need-Request (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。 2.安全性检查 (1)设置两个工作向量Work=Available;Finish[M]=False (2)从进程集合中找到一个满足下述条件的进程, Finish [i]=False Need<=Work 如找到,执行(3);否则,执行(4) (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 Work=Work+Allocation Finish=True

银行家算法实验报告

银行家算法实验报告 一、设计目的 银行家算法是是最具有代表性的避免死锁的算法,由于该算法能用于银行系统现金贷款而得名。该算法能够进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念。 二、设计要求 根据银行家算法的基本思想,编写和调试一个动态分配的模拟程序,并能够有效的防止和避免死锁的发生。 三、设计思想 银行家算法: 我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。 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、银行家算法

银行家算法实验报告

目录 一、设计目的............................ 错误!未定义书签。 二、设计内容............................ 错误!未定义书签。 三、设计原理............................ 错误!未定义书签。 四、算法实现............................ 错误!未定义书签。 五、流程图.............................. 错误!未定义书签。 六、源程序.............................. 错误!未定义书签。 七、运行示例及结果分析.................. 错误!未定义书签。 八、心得体会............................ 错误!未定义书签。 九、参考资料............................ 错误!未定义书签。

一、设计目的 银行家算法是避免死锁的一种重要方法。通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法 二、设计内容 根据银行家算法的基本思想,编写和调试一个实现动态资源分配的模拟程序,并能够有效地防止和避免死锁的发生。 (1)设计思想说明 设计银行家算法是为了避免死锁 三、设计原理 1.算法设计思路 银行家算法其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。这时系统将该进程从进程集合中将其清除。此时系统中的资源就更多了。反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他。请进程等待2.算法流程图

银行家算法实验报告

操作系统实验报告1 银行计算法的 实现 班级:计算机科学与技术082班级 姓名: 学号: 老师:霍林

实验目的: 计算机科学与技术专业学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,其目的在于加深催操作系统基础理论和基本知识的理解,加强学生的动手能力.银行家算法是避免死锁的一种重要方法。通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法 实验环境: Windos XP系统,java编程 实验分析: 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];

银行家算法实验报告c语言

银行家算法实验报告c语言 银行家算法实验报告 引言: 计算机科学中的银行家算法是一种资源分配和避免死锁的算法。它是由艾德加·戴克斯特拉(Edsger Dijkstra)在1965年提出的。银行家算法通过判断一个 系统是否处于安全状态来决定是否分配资源给进程。本实验旨在使用C语言实 现银行家算法,并通过一系列的实例来验证其有效性。 一、实验背景 银行家算法是为了解决资源分配中的死锁问题而提出的。在多进程系统中,每 个进程都需要一定数量的资源来完成任务。然而,如果资源分配不当,可能会 导致死锁的发生,即所有进程都陷入无法继续执行的状态。银行家算法通过合 理地分配资源,避免了死锁的发生。 二、实验目的 本实验的主要目的是通过C语言实现银行家算法,并通过实例验证其正确性和 有效性。具体而言,我们将模拟一个系统中的多个进程,并为每个进程分配资源。然后,我们将使用银行家算法来判断系统是否处于安全状态,从而决定是 否继续分配资源。 三、实验过程 1. 创建进程和资源 我们首先创建了5个进程和3种资源。每个进程需要的资源数量是随机生成的,以模拟真实情况下的资源需求。 2. 分配资源

根据银行家算法的原则,我们按照以下步骤来分配资源: - 首先,检查每个进程的资源需求是否小于等于系统当前可用的资源数量。 - 如果满足条件,将资源分配给该进程,并更新系统剩余资源数量。 - 如果不满足条件,暂时不分配资源给该进程,继续检查下一个进程。 3. 判断系统状态 在每次资源分配后,我们需要判断系统是否处于安全状态。为此,我们使用银 行家算法的核心原则:只有当系统能够为每个进程提供所需的资源时,系统才 是安全的。我们通过遍历所有进程来检查其资源需求是否小于等于系统剩余资 源数量,如果满足条件,说明系统是安全的。 4. 实例验证 我们进行了多个实例验证,以确保银行家算法的正确性。在每个实例中,我们 模拟了不同的进程和资源需求,并观察系统的状态。通过比较实验结果和预期 结果,我们验证了银行家算法的有效性。 四、实验结果 通过多次实验,我们得出了以下结论: 1. 银行家算法能够有效地避免系统死锁的发生。在所有实例中,只有当系统处 于安全状态时,资源才会被分配给进程。 2. 银行家算法能够合理地分配资源,满足每个进程的需求,并保持系统的安全 状态。 3. 银行家算法的实现过程相对复杂,需要对进程和资源进行多次检查和更新。 五、实验总结 通过本次实验,我们成功地使用C语言实现了银行家算法,并验证了其有效性。

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

银行家算法的模拟实现 一、实验题目: 模拟实现银行家算法的处理过程 二、实验目的: 银行家算法是防止死锁的代表性算法。本实习旨在加深了解有关资源申请、防止死锁、状态平安性等概念,并体会和运用防止死锁的具体实施方法。然后依照本实习,自行设计模拟程序。 三、实验原理: 1.我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金, 进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规那么为进程分配资源。 当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量那么按当前的申请量分配资源,否那么就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。假设超过那么拒绝分配资源,假设没有超过那么再测试系统现存的资源能否满足该进程尚需的最大资源量,假设能满足那么按当前的申请量分配资源,否那么也要推迟分配。 2.平安状态:如果存在一个由系统中所有进程构成的平安序列P1,…,Pn,那么系统处 于平安状态。平安状态一定是没有死锁发生。 不平安状态:不存在一个平安序列。不平安状态一定导致死锁。 平安序列:一个进程序列{P1,…,Pn}是平安的,如果对于每一个进程Pi(1≤i≤n〕,它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。 3.设requesti为进程p[i]的请求向量,如果requesti[j]=K,表示进程p[i]需要K个Rj资源。 当系统发出请求后,系统按下述步骤开场检查: 1〕如果requesti[j]<=need[i][j],转向步骤2;否那么报告出错,申请的资源已经大于它需要的最大值。 2〕如果requesti[j]<=available[j],转向步骤3;否那么报告出错,尚无足够的资源。 3〕系统试探着把资源分配给p[i],并修改以下数据构造中的值: available[j]=available[j]-request[j] allocation[i][j]=allocation[i][j]+request[j] need[i][j]=need[i][j]-request[j] 4〕系统进展平安性算法,检查此次分配后,系统是否还处于平安状态,假设平安,把资源分配给进程p[i];否那么,恢复原来的资源分配状态,让进程p[i]等待。 4. 平安性算法: int work[RESOURCE_NUMBER]; bool finish[PROCESS_NUMBER]; 1) Work=Available;

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

《银行家算法的模拟实现》 --实验报告 题目: 银行家算法的模拟实现 专业: 班级: 组员: 指导老师: 一、实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验的目的在于让学生独立的使用高级语言编写与调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件与原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。 二、实验内容 模拟实现银行家算法实现死锁避免。要求:初始数据(如系统在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 ALLOCATION[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; (6)、系统调用安全性检查算法(checksafe()函数)进行检查,如果检查通过,则不用回收,否则进 行回收,进程资源申请失败进入等待。 4、安全性检查算法(checksafe()子函数) (1)、设置两个临时变量。 FINISH[N]记录进程模拟执行的结束状态,初值为0,如果可以模拟执行结束,则可设为1,也可设为其它非零值以表示执行的先后次序。 WORK[M]记录模拟执行中资源的回收情况,初值为A V AILABLE[M]的值。 (2)、在进程中查找符合以下条件的进程。 条件1:FINISH[I]=0 条件2:NEED[I][J]〈=WORK[J] (3)、如果查找成功则进行资源的模拟回收,语句如下: WORK[J]=WORK[J]+ALLOCA TION[I][J]; FINISH[I]=1 或查找到的顺序号 (4)、如果查找不成功,则检查所有进程的FINISH[],如果有一个为0,则系统不为0,返回不成 功标志。否则返回成功标志。 四、系统流程图

银行家算法 实验报告

淮海工学院计算机工程学院实验报告书 课程名:《操作系统原理》 题目:银行家算法 班级: D 学号: 姓名:

一、实验目的 银行家算法是操作系统中避免死锁的典型算法,本实验可以加深对银行家算法的步 骤和相关数据结构用法的更好理解。 实验环境 Turbo C 2.0/3.0或VC++6.0 实验学时 4学时,必做实验。 二、实验内容 用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。程序能模拟多个进程共享多种资源的情形。进程可动态地申请资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况。 三、实验说明 实验中进程的数量、资源的种类以及每种资源的总量Total[j]最好允许动态指定。初始时每个进程运行过程中的最大资源需求量Max[i,j]和系统已分配给该进程的资源量Allocation[i,j]均为已知(这些数值可以在程序运行时动态输入),而算法中其他数据结构的值(包括Need[i,j]、Available[j])则需要由程序根据已知量的值计算产生。 四、实验步骤 1、理解本实验中关于两种调度算法的说明。 2、根据调度算法的说明,画出相应的程序流程图。 3、按照程序流程图,用C语言编程并实现。 五、分析与思考 1.要找出某一状态下所有可能的安全序列,程序该如何实现? 要找出这个状态下的所有可能的安全序列,前提是要是使这个系统先处于安全状态,而系统的状态可通过以下来描述:进程剩余申请数=最大申请数-占有数;可分配资源数=总数-占有数之和;通过这个描述来算出系统是否安全,从而找出所有的安全序列。 2.银行家算法的局限性有哪些? 银行家算法是一种最有代表性的避免死锁的算法。银行家算法即把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申

银行家算法实验报告

《银行家算法的模拟实现》实验报告 题目:银行家算法的模拟实现 专业:软件工程 班级:B184 学号:20180614423 姓名:吴文骏 日期:2020年5月23日

一、实验目的 1、理解银行家算法。 2、掌握进程安全性检查的方法与资源分配的方法 二、实验内容与基本要求 编制模拟银行家算法的程序,并给出一个例子验证所编写的程序的正确性。 三、实验报告内容 银行家算法和安全性检查算法原理: 我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。 为保证资金的安全,银行家规定: (1)当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳 该顾客; (2)顾客可以分期贷款,但贷款的总数不能超过最大需求量; (3)当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款 可推迟支付,但总能使顾客在有限的时间里得到贷款; (4)当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资 金。 操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。 (一)银行家算法(bank()函数): 进程i发出请求资源申请,

(1)如果Request [j]<=need[i,j],转向步骤(2),否则认为出错,因为他所需要的资源数已经超过它所宣布的最大值。 (2)如果:Request i[j]<=available[i,j],转向步骤(3),否则表示尚无足够资源,进程i需等待。 (3)若以上两个条件都满足,则系统试探着将资源分配给申请的进程,并修改下面数据结构中的数值: Available[i,j]= Available[i,j]- Request [j]; Allocation[i][j]= Allocation[i][j]+ Request [j]; need[i][j]= need[i][j]- Request [j]; (4)试分配后,执行安全性检查,调用check()函数检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程。否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。 (5)用do{…}while 循环语句实现输入字符y/n判断是否继续进行资源申请。 (二)安全性算法(safe()函数): (1)设置两个向量:工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work= Available。工作向量Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]=false;当有足够的资源分配给进程时,再令Finish[i]=true。 (2)在进程中查找符合以下条件的进程: 条件1:Finish[i]=false; 条件2:need[i][j]<=Work[j] 若找到,则执行步骤(3)否则,执行步骤(4) (3)当进程获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work[j]= Work[j]+ Allocation[i][j];Finish[i]=true;goto step (2); (4)如果所有的Finish[i]=true都满足,则表示系统处于安全状态,否则,处于不安全状态。

银行家算法实验报告模版

淮海工学院计算机科学系 实验报告书 课程名:《操作系统原理》 题目:银行家算法 班级: 学号: 姓名: 操作系统原理实验--银行家算法实验报告 1目的与要求: 1)本实验目的是通过使用银行家算法实现系统资源的分配和安全性检查模拟,提高学生对操作系统资源分配功能的深刻理解,并培养学生对操作系统开发的兴趣与应用能力; 2)实验前必须认真阅读和理解银行家算法的基本原理和实现方法; 3)独立使用C或VC++编程语言编写银行家算法模拟程序; 4)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果) 5)于2011年4月10日以前提交本次实验报告(含电子和纸质报告,由学习委员以班为单位统一打包提交)。 2 实验内容或题目 1)设计五个进程{P0,P1,P2,P3,P4}共享三类资源{A,B,C}的系统,{A,B,C}的资源总数量分别为10,5,7。(参考书上用例) 2)并行进程可动态地申请资源和释放资源(程序交互输入申请或释放资源数量),系统按各进程的申请动态地分配资源。 3)每当进程动态申请资源或释放资源时,模拟程序应能及时显示或打印各个进程在此时刻的资源分配表、系统可用资源量和安全序列等资源分配信息和安全检查信息。 4)本次实验内容(项目)的详细说明以及要求请参见实验指导书。 3 实验步骤与源程序 (学生自己填写) 4 测试数据与实验结果(可以抓图粘贴) (学生自己填写) 5 结果分析与实验体会 (学生自己填写)

2. 版面格式: (1)各级标题:黑体,小四,段前/段后:6磅 (2)正文内容:宋体、五号,行间距1.25倍; (3)程序代码:宋体、五号,单倍行间距; (4)A4纸,上、下、左、右边距:2厘米 注:蓝色字体部分为注释,正式报告中将其删除。 《操作系统原理》实验报告 - 1 -

银行家算法实验报告

一、实验目的 银行家算法是避免死锁的一种重要方法。通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法 二、实验要求 根据银行家算法的基本思想,编写和调试一个实现动态资源分配的模拟程序,并能够有效地防止和避免死锁的发生。 (1)设计思想说明 设计银行家算法是为了避免死锁 三、实验方法内容 1.算法设计思路 银行家算法又称“资源分配拒绝”法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。这时系统将该进程从进程集合中将其清除。此时系统中的资源就更多了。反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他。请进程等待 2.算法流程图

3.算法中用到的数据结构 数据结构的说明 1.可利用资源向量AVAILABLE。这是一个含有M个元素的数组,其中的每 一个元素代表一类可利用的资源数目,其3初始值是系统中所配置的该类 全部可哦那个资源的数目,其数值随该类资源的分配和回收而动态的改 变。 2.最大需求矩阵MAX。这是一个M*N的矩阵,它定义了系统中N个进程中的 每一个进程对M类资源的最大需求。 3.分配矩阵ALLOCATION。这也是一个M*N的矩阵,它定义了系统中每一类 资源当前已分配给每一进程的资源数。 4.需求矩阵NEED。这也是一个M*N的矩阵,用以表示每一个进程尚需的各 类资源数。 5.NEED[R,W]=MAX[R,W]-ALLOCATION[R,W]

银行家算法实验报告总结

银行家算法实验报告总结 一、实验目的与背景 银行家算法是一种用于避免死锁和保证系统稳定运行 的算法。通过模拟银行贷款行为的策略,银行家算法可以有效地避免系统的资源枯竭,从而保证系统的正常运行。在本实验中,我们通过使用银行家算法对实际的系统进行模拟,验证其有效性。 二、算法原理与流程 银行家算法的主要原理是:将系统中的所有资源按照类型进行分类,并对每种资源设置一个最大值和最小值,分别表示该资源的最大需求量和最小剩余量。同时,对于每个进程,需要定义其最大需求量、已分配资源和需求量,并根据这些信息来决定是否分配资源。 具体流程如下: 初始化:将所有资源的最大值和最小值进行初始化,并给每个进程分配一个唯一的标识符。 请求资源:每个进程在执行过程中,如果需要更多的资源,则向系统发送请求。 分配资源:系统根据银行家算法的原理,将资源分配给满足条件的进程。 更新资源:系统更新已分配给进程的资源,并检查是否满足每个进程的最大需求量。

重复执行:如果存在多个进程需要资源,则重复执行步骤2-4,直到所有进程都满足其最大需求量或系统中的资源 不足以为更多的进程分配资源为止。 三、实验数据与结果 在本实验中,我们使用了10个进程,每个进程的需求 量和已分配资源均随机生成。实验结果表明,在满足了每个进程的最大需求量后,系统中仍有剩余资源,证明了银行家算法可以有效地避免资源的浪费。 四、结果分析 通过对实验结果进行分析,我们发现银行家算法可以有效地保证系统的稳定性,避免出现死锁和资源枯竭等问题。同时,该算法需要较少的系统开销,因为只需要对每个进程的请求进行处理和更新,不需要进行额外的检查和管理。 五、性能对比分析 为了进一步验证银行家算法的性能,我们将其与其他常见的资源管理算法进行了比较。在同等条件下,与其他算法相比,银行家算法具有更高的系统吞吐量和更低的响应时间。 银行家算法在系统吞吐量和响应时间方面均优于其他 常见算法,而在死锁发生率上,银行家算法则表现出了更高的稳定性。 六、实验总结 本实验通过模拟实际系统验证了银行家算法的优越性。

银行家算法实验报告

计算机操作系统实验报告 一、实验名称:银行家算法 二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简 单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法; 三、问题分析与设计: 1、算法思路:先对用户提出的请求进行合法性检查,即检查请求是否 大于需要的,是否大于可利用的;若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查;若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请; 2、银行家算法步骤:1如果Requesti<or =Need,则转向步骤2;否则, 认为出错,因为它所需要的资源数已超过它所宣布的最大值; 2如果Request<or=Available,则转向步骤3;否则,表示系统中尚无足够的资源,进程必须等待; 3系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数 值: Available=Available-Requesti; Allocation=Allocation+Request; Need=Need-Request; 4系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态; 3、安全性算法步骤:

1设置两个向量 ①工作向量Work;它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation; ②布尔向量Finish;它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finishi=false,当有足够资源分配给进程时,令Finishi=true; 2从进程集合中找到一个能满足下述条件的进程: ①Finishi=false ②Need

银行家算法实验报告

银行家算法实验报告 引言: 在计算机科学领域,由于资源的有限性,进程资源分配问题一直备受关注。而银行家算法被广泛应用于操作系统中,用于确保资源的安全分配。本文旨在介绍银行家算法的原理和应用,并通过实验报告来验证该算法的有效性和可行性。 1. 银行家算法简介 银行家算法是由美国学者Dijkstra提出的一种资源分配和避免死锁的算法。其基本思想是通过银行家的原则来避免系统陷入死锁状态,保证资源分配的安全性和可行性。银行家算法适用于具有多个进程和多个资源的并发系统中。 2. 银行家算法原理 银行家算法基于两个重要的概念:安全性和可分配性。安全性表示在系统当前状态下,是否存在一种资源分配序列可以使系统避免死锁状态。可分配性表示系统是否能够满足进程对资源的请求。 银行家算法的实现需要以下几个关键步骤:

(1) 初始化:对每个进程设置最大需求量、已分配资源量和需 求资源量。 (2) 效验:判断系统当前状态下资源是否满足所有进程的需求,即判断系统是否处于安全状态。 (3) 分配:若系统处于安全状态,则根据某种资源分配策略, 为进程分配资源。 (4) 请求:进程请求资源。 (5) 回收:进程释放资源。 3. 银行家算法的实验验证 为了验证银行家算法的有效性和可行性,我们设置了一个简单 的实验环境,模拟一个有限的资源系统,包含3个进程和3种不 同类型的资源。 实验过程如下: (1) 初始化:对每个进程设置最大需求量、已分配资源量和需 求资源量。设置3个进程的最大需求量分别为{5, 4, 3},已分配资 源量分别为{1, 2, 2},需求资源量分别为{3, 2, 0}。 (2) 效验:判断系统当前状态下资源是否满足所有进程的需求。

实验二银行家算法实验报告

实验二银行家算法实验报告 一、实验目的 通过本次实验,主要学习了解了银行家算法的原理和实现方式,掌握银行家算法的应用场景,了解了安全序列的概念和判断方法,并通过代码实现加深对银行家算法的理解和掌握。 二、实验过程 1、阅读银行家算法的相关理论知识。 2、编写银行家算法的代码实现。 3、根据实验要求,设置不同的初始资源分配和不同的进程请求资源情况,分别计算是否存在安全序列。 三、实验结果与分析 1、首先按照实验要求设置一个初始的资源分配情况: 可用的资源数目:4 4 4 进程数目:4 各进程对三种资源的最初需要数目: Max:7 5 3 3 2 2 9 0 2 2 2 2 已分配资源数目: Allocation:0 1 0 2 0 0 3 0 2 2 1 1

剩余资源数目: Need: 7 4 3 1 2 2 6 0 0 0 1 1 根据上述数据,计算出该初试分配情况下的安全序列为:1 -> 3 -> 4 -> 2。 2、然后设置一个进程请求资源的情况: 进程 1 请求资源 [3,3,0],进程 2 请求资源 [1,0,1],进程 3 请求资源 [2,2,0],进程 4 请求资源 [0,0,2]。 根据银行家算法,先进行安全性检测,发现该系统不存在安全序列,因此不满足银行 家算法的要求,请求不被满足。 3、接着修改初始的资源分配情况和请求的资源情况,进行比较: 通过以上的实验操作,得出结论:只有当请求的资源不会导致系统不再安全时,才会 满足请求。银行家算法基于这个假设进行运算,它管理着一个可以分配的表格,该表格显 示系统的各种资源已经分配和未分配的情况,并确定哪些进程可以分配资源,哪些不可 以。 四、实验总结 本次实验通过对银行家算法的概念、原理和应用场景的了解,对该算法有了更深的认 识和理解,并通过代码实现和实验操作,进一步巩固和掌握了该算法的应用方法。在实验 过程中,也有一些需要注意的问题:如需要按照一定的顺序输入原数据,正确地计算资源 分配和剩余情况;核实每个请求的资源数目是否足够,才进行安全性检测;注意计算过程 中数值的准确性和解题思路的正确性等。总之,通过这次实验,提高了我们在算法设计与 分析方面的能力,为今后的学习和研究打下了良好的基础。

操作系统实验银行家算法模拟实现(强烈推荐)

操作系统实验银行家算法模拟实现(强烈推荐) 银行家算法模拟实现 一.实验目的 1) 理解死锁避免相关内容;2) 掌握银行家算法主要流程;3) 掌握安全性检查流程。二.实验描述 本实验主要对操作系统中的死锁预防部分的理论进行实验。要求实验者设计一个程序,该程序可对每一次资源申请采用银行家算法进行分配。三.实验内容 1) 设计多个资源(≥3);2) 设计多个进程(≥3); 3) 设计银行家算法相关的数据结构; 4) 动态进行资源申请、分配、安全性检测并给出分配结果。四.实验要求 1) 编写程序完成实验内容;2) 画出安全性检测函数流程图;3) 小组派1人上台用PPT演讲实现过程;4) 撰写实验报告。测试要求 1) 进行Request请求,输入参数为进程号、资源号和资源数;2) 进行3次以上的Request请求; 3) 至少进行1次资源数目少于可用资源数,但不安全的请求。五.实验设备 PC机1台,要求安装DOS7.1、Turbo C3.0、Windows2000。 六.实验结果 七.实验思考 1)针对死锁有哪些可行方案?2)死锁解除的难点是什么? 八.银行家算法介绍 8.1银行家算法的数据结构 1) 可利用资源向量Available。其中每个元素代表每类资源的数目。

2) 最大需求矩阵Max。其中每个元素代表每个进程对于每类资源的最大需求量。 Max[i,j]=K表示i进程对于j类资源的最大需求量为K。 3) 分配矩阵Allocation。其中每个元素代表每个进程已得到的每类资源的数目。4) 需求矩阵Need。其中每个元素代表每个进程还需要的每类资源的数目。8.2银行家算法 Request i [j]=K表示进程Pi需要K个j类资源。 1)如果Request i [j]≤Need[i , j],便转向步骤2,否则认为出错。 2)如果Request i [j]≤Available[j],便转向步骤3,否则表示无足够资源,Pi需 等待; 3)系统尝试分配资源给Pi; 4)系统进行安全性检查,检查此次资源分配后,系统是否安全。如果安全,则正式分 配资源,否则撤销此次分配。8.3安全性算法 1)设置两个向量:工作向量Work和Finish。算法开始时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;到第2)步。 4) 直到所有Finish[i]=True,表示系统处于安全状态;否则系统处于不安全状态。 #include #include #include

相关主题
文本预览
相关文档 最新文档