操作系统
上机实验报告
银行家算法模拟
实验人:
学 号:
2011 年 11 月 07 日
实验报告
1、实验目的
模拟银行家算法,加深了解有关资源申请、死锁避免、状态安全性等概念,
并体会和运用避免死锁的具体方法。然后自行设计模拟程序。
2、实验内容
用 C 语言或 C++语言对银行家算法进行模拟。
要求以文件形式输入以下数组:
Available: array[1..m]of integer;
Max: array[1..n,1..m]of integer;
Allocation: array[1..n,1..m]of integer;
Need: array[1..n,1..m]of integer;
输入文件内容及格式见附录 A。其中,资源种类数 m=3,进程数 n=5
在程序中手工输入:
Request i: array[1..m]of integer;
要求检测输出若满足该进程的请求则系统状态是否安全,若状态安全则输出
//第 i 个进程的资源请求
//当前分配
//系统可用资源
//进程最大需求
//尚需资源
安全进程序列。
3、实验笔记
2011 年 11 月 7 日星期一
内容:深刻了解有关实验目的,仔细阅读有关实验内容,对银行家算法进行初步的构思,分
析。
原理:银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地
申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致
系统进入不安全状态,则分配,否则等待。 银行家算法的基本思想是分配资源之前,判断
系统是否是安全的;若是,才分配。
//系统可用资源
//进程最大需求
//当前分配
2011 年 11 月 8 号星期二
内容:分析实现银行家算法所需资源,Available :系统可用资源、Max: 进程最大需求、
Allocation:当前分配、Need: array 尚需资源、Request i: 第 i 个进程的资源请求。
Available: array[1..3]of integer;
Max: array[1..5,1..3]of integer;
Allocation: array[1..5,1..3]of integer;
Need: array[1..5,1..3]of integer;
Request i: array[1..3]of integer;
2011 年 11 月 14 号星期一
内容:选择利用 c++完成银行家算法,对数据进行处理,从文件 banker 中读入 Available :
系统可用资源、Max: 进程最大需求、Allocation:当前分配、Need: array 尚需资源等资源的数
据。
问题:读取的数据不能显示
//尚需资源
//第 i 个进程的资源请求
2
实验报告
解决:报 banker 中的英文单词删除
2011 年 11 月 18 日
内容:继续完成银行家算法
(1)如果 Request[N]<=NEED[I,N],则转(2);否则,出错。
(2)如果 Request[N]<=AVAILABLE,则转(3);否则,出错。
3
实验报告
(3)系统试探分配资源,修改相关数据:
AVAILABLE=AVAILABLE-REQUEST
ALLOCATION=ALLOCATION+REQUEST
NEED=NEED-REQUEST
系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程
等待。
2011 年 11 月 19 日
内容:安全性检查
FINISH[M]=FALSE
(2)从进程集合中找到一个满足下述条件的进程,
FINISH[i]=FALSE
NEED<=AVAILABLE
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
AVAILABLE+=ALLOCATION
FINISH=TRUE
GO TO 2
(4)如所有的进程 Finish[M]=true,则表示安全;否则系统不安全。
2011 年 11 月 20 日
内容;试图简化代码,但没有成功。
4、总结
对本次实践进行简单总结(例如,问题,收获等)。
银行家算法是避免死锁的一种重要方法,在完成作业的过程中加深了解有关
资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
银行家算法描述:操作系统按照银行家制定的规则为进程分配资源,当进
程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存
的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推
迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资
源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满
足则按当前的申请量分配资源,否则也要推迟分配。
在完成作业的过程中也遇到了麻烦,从文件中读入数据应该删除多余的注释
等,以免对读入的数造成影响。自己做的银行家算法太过于麻烦的有无力改
变,暂时没有想到什么好的解决办法。
附录 A:
输入文件内容及格式:
Max
7 5 3
3 2 2
9 0 2
2 2 2
4 3 3
Allocation
4
实验报告
0 1 0
2 0 0
3 0 2
2 1 1
0 0 2
Need
7 4 3
1 2 2
6 0 0
0 1 1
4 3 1
Available
3 3 2
输出内容(填写程序运行时屏幕上的输出结果):
以进程 2 为例,请求资源 1,1,1;
源代码:
#include
#include
using namespace std;
int main()
{
int const m=3;
5
实验报告
int const n=5;
bool A(int,int Need[5][3]);
void B(int
i,int Max[5][3],int Need[5][3],int Allocation[5][3],int
Available[3]);
int Max[5][3];
//进程最大需求
int Allocation[5][3]; //当前分配
int Need[5][3];
//尚需资源
int Available[3];//系统可用资源
int Request[3];
bool t[n];
int a,k;
int a1,a2;
ifstream infile("banker.txt",ios::in);
if(!infile)
{
}
cerr<<"open error!"<
>Max[i][j];
cout<实验报告
cout<
>Allocation[i][j];
cout<>Need[i][j];
cout<>Available[i];
cout<实验报告
for(k=0;k<5;k++)
{
}
t[k]=false;
cout<<"请输入满足哪进程的请求:";
cin>>a;
cout<<"进程"<
>Request[i];
{
}
for( i=0;iAvailable[i])
{
}
cout<<"请求资源过大,超过可用资源量"<