银行家算法分析
- 格式:docx
- 大小:173.46 KB
- 文档页数:8
银行家算法实现
一.相关原理
银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程所用;第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,单它仍继续宝石已得到的所有其他资源;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。
防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。
通过这个算法可以用来解决生活中的实际问题,如银行贷款等。
二.程序流程图:
1.初始化算法流程图:
2.银行家算法流程图:
3.安全性算法流程图:
三.程序的实现
#include<iostream>
using namespace std;
int main()
{
int m,n,t,i,j,a[100],p=0,q,work[100],need[100][100];
int avaliable[100],max[100][100],allocation[100][100],request[100][100];
char ch='Y';
cin>>m; //m种资源
cin>>n; //n个进程
for(i=0;i<m;i++) //每种资源的可用数目
cin>>avaliable[i];
for(i=0;i<n;i++)
{
a[i]=i;
for(j=0;j<m;j++) //最大需求量
cin>>max[i][j];
for(j=0;j<m;j++)
{
cin>>allocation[i][j]; //已分配量
need[i][j]=max[i][j]-allocation[i][j];
}
}
for(i=0;i<m;i++)//m种资源
{
for(j=0;j<n;j++) //n个进程
avaliable[i]=avaliable[i]-allocation[j][i];
}
while(ch=='Y'||ch=='y')
{
p=0;
cout<<"请输入进程号和对每类资源的请求数:"<<endl; cin>>t;
t--;
for(j=0;j<m;j++)
cin>>request[t][j];
int flag=1;
for(j=0;j<m;j++)
{
if(request[t][j]>need[t][j])
{flag=0;break;}
}
for(j=0;j<m;j++)
{
if(request[t][j]>avaliable[j])
{flag=0;break;}
}
if(flag==1)
{
for(i=0;i<m;i++)
{
avaliable[i]=avaliable[i]-request[t][i];
work[i]=avaliable[i];
allocation[t][i]=allocation[t][i]+request[t][i];
need[t][i]=need[t][i]-request[t][i];
}
}
else
{
cout<<"Input Error"<<endl;
goto A;
}
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
{
if(a[i]>=0)
{
int flag=1;
for(q=0;q<m;q++)
{
if(need[i][q]>work[q])
{flag=0;break;}
}
if(flag==1)
{
p++;
for(q=0;q<m;q++)
{
work[q]=work[q]+allocation[i][q];
}
a[i]=-1;
}
}
}
}
if(p==n)
{
cout<<"Yes"<<endl;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++) //最大需求量
cout<<max[i][j]<<" ";
for(j=0;j<m;j++)
{
cout<<allocation[i][j]<<" "; //已分配量}
for(j=0;j<m-1;j++)
{
cout<<need[i][j]<<" "; //需求量
}
//cout<<endl;
cout<<need[i][j]<<endl;
}
for(j=0;j<m-1;j++)
{
cout<<avaliable[j]<<" "; //可用资源数
}
cout<<avaliable[j]<<endl;
}
else
{
cout<<"Wait"<<endl;
for(i=0;i<m;i++)
{
avaliable[i]=avaliable[i]+request[t][i];
allocation[t][i]=allocation[t][i]-request[t][i];
need[t][i]=need[t][i]+request[t][i];
}
A: for(i=0;i<n;i++)
{
for(j=0;j<m;j++) //输出最大需求量
cout<<max[i][j]<<" ";
for(j=0;j<m;j++)
{
cout<<allocation[i][j]<<" "; //输出已分配量}
for(j=0;j<m-1;j++)
{
cout<<need[i][j]<<" "; //输出需求量
}
//cout<<endl;
cout<<need[i][j]<<endl;
}
for(j=0;j<m-1;j++)
{
cout<<avaliable[j]<<" "; //输出可用资源数
}
cout<<avaliable[j]<<endl;
}
cout<<"是否要继续Y/N"<<endl;
cin>>ch;
}
return 0;
}
操作输出结果:
四.实验心得
银行家算法的模拟实现”是本学期操作系统课程中重要的课程设计。
在设计此程序的过程中,我遇到过许多问题,也学到了很多东西。
本程序的设计实现主要是用C++语言实现,通过对程序算法的设计优化、输出显示的格式设计、输入过程中的异常处理等一些设计过程中的问题的考虑解决,在C++学习上也有了很大的进步。
程序设计过程中开始遇到的最大的问题是算法的结构设计问题,课本上只给了设计要求及简单的算法,要真正实现还需要考虑很多方面。
在算法的数据结构设计上考虑了很长时间。
在程序设计中先后参考了很多网络资料,也参考了一些别人写的的程序,综合这些算法思想和自己的思路对程序做了很好的设计方式,对一些算法的优越性等也作了一些考虑。
此外考虑最多的就是异常错误处理的设计。
一个好
的程序必须能在各种环境下都有其相应的处理方式,至少能应对一些常见的可能发生的错误。
比如一般的要求输入为数字时,如果输入了一个非数字字符,程序就会立即出错无法继续运行,本程序针对这个问题设计了一个shuzi();函数进行处理,处理方式为:接受键盘输入的字符为字符串,然后对字符串的每个字符进行判断是否为数字,如果有非数字字符出现则提示出错并要求重新输入。
又如在判断是否继续时要求输入Y/N时,按一般的方式,如果输入为多个字符,则多余的字符会保存在缓冲区,到下次要求输入时输入而导致出错,对此问题设计处理方式为接受输入字符保存为串然后只取其首字符进行判断。
还有很多类似的错误处理。
还有在设置程序的显示优化时,发现暂停函数在不同的情况下执行顺序不同,如此等等。
在课程设计过程中遇到了许多问题,也向同宿舍的同学做了一些请教一起讨论,也因此从他们身上学到了许多东西。