您好,欢迎来到年旅网。
搜索
您的当前位置:首页银行家算法 实验报告

银行家算法 实验报告

来源:年旅网


淮海工学院计算机工程学院

实验报告书

课程名: 《操作系统原理》

题 目: 银行家算法 班 级: 学 号: 姓 名:

评语: 成绩: 指导教师: 批阅时间: 年 月 日 《操作系统原理》实验报告 - 1 -

一、实验目的

银行家算法是操作系统中避免死锁的典型算法,本实验可以加深对银行家算法的步骤和相关数据结构用法的更好理解。 实验环境

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.银行家算法的局限性有哪些?

答:银行家算法是一种最有代表性的避免死锁的算法。银行家算法即把操作系统看作是银行

家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源

《操作系统原理》实验报告 - 2 -

数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。但任何一种算法都存在其缺点,对各进程的资源分配要求严格,经常使其处于不安全状态,银行家算法的主要局限是过于谨慎和检查各申请者对各类资源的最大需求量开销较大。

六、测试数据与实验结果

银行家算法流程图(1)所示: 申请成功。输出各种数据的变化 申请失败。 以上分配作废,恢复原来的分配状态: Available[j] = Available[j] + Requesti[j] Allocation[i][j]= Allocation[i][j]-Requesti[j] Need[i][j] = Need[i][j]+Requesti[j] 是 假定分配之后,系统安全吗? 否 假定分配: Requesti[j]> Need[i][j] 输入初始参数(资源分配及请求情开始 Y 出错返回:return(error) N Requesti[j]> Available[j] Y 出错返回:(进程阻塞) return(error) N Available[j] = Available[j] – Requesti[j] Allocation[i][j]= Allocation[i][j] + Requesti[j] Need[i][j] = Need[i][j] – Requesti[j]

结束 图(1)银行家算法流程《操作系统原理》实验报告 - 3 -

运行结果如图(2)(3)所示:

图(2)

图(3)银行家算法截图

七、实验心得与体会

银行家算法是操作系统中避免死锁的典型算法。所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程. 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

通过这次实验,加深了我对银行家算法的了解,掌握了如何利用银行家算法避免死锁.在实验中,难免会遇到问题,通过自己在网上查找资料、询问同学,这些问题都得到了解决,完成了本次实验。

《操作系统原理》实验报告 - 4 -

通过这次的实验,使我的理论知识更加的牢固。

附录

#includeint 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]:\"<for (j=0;j〈N;j++)

cout<〈Avaliable[j]〈〈\" \";//输出分配资源 cout〈〈endl;

cout〈<\" Max Allocation Need”〈 cout〈<\"进程名 \"; for(j=0;j〈3;j++){ for(i=0;icout〈for(i=0;icout<〈Max[i][j]<〈” ”; cout<<\" \"; for(j=0;jcout〈〈Need[i][j]〈<” \"; cout<int changdata(int i)//进行资源分配 { int j;

for (j=0;jAvaliable[j]=Avaliable[j]—Request[j];

Allocation[i][j]=Allocation[i][j]+Request[j]; Need[i][j]=Need[i][j]-Request[j]; }

return 1; }

int safe()//安全性算法 {

int i,k=0,m,apply,Finish[100]={0}; int j; int flag=0;

Work[0]=Avaliable[0]; Work[1]=Avaliable[1]; Work[2]=Avaliable[2]; for(i=0;i〈M;i++){ apply=0;

for(j=0;j〈N;j++){

if (Finish[i]==False&&Need[i][j]<=Work[j]){ apply++;

if(apply==N){

for(m=0;mWork[m]=Work[m]+Allocation[i][m];//变分配数 Finish[i]=True; temp[k]=i; i=—1; k++; flag++; } } } }

for(i=0;i〈M;i++){

if(Finish[i]==False){

cout〈<\"系统不安全\"〈《操作系统原理》实验报告 - 6 -

cout〈〈\"系统是安全的!\"〈〈endl;//如果安全,输出成功 cout<〈”分配的序列:\";

for(i=0;i〈M;i++){//输出运行进程数组 cout〈if(i〈M—1) cout<<\"-〉”; }

cout〈void share()//利用银行家算法对申请资源对进行判定 {

char ch; int i=0,j=0; ch=’y’; cout〈〈”请输入要求分配的资源进程号(0—”<〈M-1<〈”):”; cin〉>i;//输入须申请的资源号

cout〈<\"请输入进程 \"<〈i〈<” 申请的资源:”〈〈endl; for(j=0;jcout〈〈name[j]〈<\":\";

cin〉>Request[j];//输入需要申请的资源 }

for (j=0;j〈N;j++){ if(Request[j]〉Need[i][j])//判断申请是否大于需求,若大于则出错 {

cout〈<\"进程 \"〈break; }

else {

if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则 { //出错

cout<<\"进程\"〈if(ch=='y’) { changdata(i);//根据进程需求量变换资源 showdata();//根据进程需求量显示变换后的资源 safe();//根据进程需求量进行银行家算法判断 } }

《操作系统原理》实验报告 - 7 -

void addresources(){//添加资源 int n,flag;

cout<<\"请输入需要添加资源种类的数量:”; cin>〉n; flag=N; N=N+n;

for(int i=0;icin>〉Avaliable[flag++]; }

showdata(); safe(); }

void delresources(){//删除资源 char ming; int i,flag=1;

cout〈<\"请输入需要删除的资源名称:”; do{

cin>〉ming; for(i=0;i〈N;i++)

if(ming==name[i]){ flag=0; break; }

if(i==N)

cout<〈”该资源名称不存在,请重新输入:”; }

while(flag);

for(int j=i;jname[j]=name[j+1];

Avaliable[j]=Avaliable[j+1];

} N=N—1; showdata(); safe(); }

void changeresources(){//修改资源函数 cout<〈”系统目前可用的资源[Avaliable]:”<cout<〉Avaliable[1]>〉Avaliable[2];

《操作系统原理》实验报告 - 8 -

cout<〈\"经修改后的系统可用资源为\"<〈endl; for (int k=0;k〈N;k++)

cout<void addprocess(){//添加作业 int flag=M; M=M+1; cout〈〈\"请输入该作业的最打需求量[Max]\"〈〈endl; for(int i=0;iMax[flag][i]; Need[flag][i]=Max[flag][i]-Allocation[flag][i]; }

showdata(); safe(); }

int main()//主函数 {

int i,j,number,choice,m,n,flag; char ming; cout〈〈”*****************单处理机系统进程调度实现*****************”〈cout<〈”请首先输入系统可供资源种类的数量:\"; cin〉>n; N=n;

for(i=0;icout〈<\"资源”<〈i+1<<\"的名称:\"; cin〉〉ming; name[i]=ming;

cout<<\"资源的数量:\"; cin>>number;

Avaliable[i]=number; } cout〈〈endl;

cout<<\"请输入作业的数量:”; cin〉〉m; M=m;

cout〈<\"请输入各进程的最大需求量(\"〈Max[i][j]; do{

《操作系统原理》实验报告 - 9 -

flag=0;

cout〈<\"请输入各进程已经申请的资源量(”<cin>>Allocation[i][j]; if(Allocation[i][j]〉Max[i][j]) flag=1;

Need[i][j]=Max[i][j]—Allocation[i][j]; }

if(flag)

cout<〈”申请的资源大于最大需求量,请重新输入!\\n”; }

while(flag);

showdata();//显示各种资源 safe();//用银行家算法判定系统是否安全 while(choice) {

cout〈<\"**************银行家算法演示***************\"<〈endl; cout<<\" 1:增加资源 \"<〈endl; cout〈〈” 2:删除资源 \"〈case 1: addresources();break; case 2: delresources();break; case 3: changeresources();break; case 4: share();break; case 5: addprocess();break; case 0: choice=0;break;

default: cout〈<”请正确选择功能号(0-5)!\"〈〈endl;break; } }

return 1; }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务