计算机学院《操作系统》课程设计报告
设计题目:银行家算法的实现
姓名:
学号:
班级: 06 网络工程班
完成日期: 2009 年 6 月 13 日
设计题目
设计形式
银行家算法的实现
独立完成
1.加深了解有关资源申请、避免死锁等概念。
2.体会和了解死锁和避免死锁的具体实施方法。
1.死锁的相关知识。
2.银行家算法。
3.系统安全性检查。
1.设计进程对各类资源最大申请表示及初值的确定。
2.设定系统提供资源的初始状况。
3.设定每次某个进程对各类资源的申请表示。
4.编制程序,依据银行家算法,决定其资源申请是否得
到满足。
5.显示资源申请和分配时的变化情况。
无
设
计
目
的
设
计
预
备
知
识
设
计
内
容
小
组
成
员
分
工
银行家算法分析、设计与实现
一、 设计理论描述
本设计的目的是通过编写和调试一个系统动态分配资源的简单模拟程序,
观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。要求
如下:
(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
GO TO 2
(4)如所有的进程 Finish[M]=true,则表示安全;否则系统不安全。
3.数据结构
#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()//显示资源矩阵
三、源代码
#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]:"<cout<<"
for(j=0;j
cout<<"系统不安全"<
";
}
cout<>i;//输入须申请的资源号
cout<<"请输入进程 "<>Request[j];//输入需要申请的资源
{
}
}
for (j=0;jNeed[i][j])//判断申请是否大于需求,若大于则出错
cout<<"进程 "<Avaliable[j])//判断申请是否大于当前资源,若
大于则
{
cout<<"进程"<}
if(ch=='y') {
changdata(i);//根据进程需求量变换资源
showdata();//根据进程需求量显示变换后的资源
safe();//根据进程需求量进行银行家算法判断
}
}
void addresources(){//添加资源
int n,flag;
cout<<"请输入需要添加资源种类的数量:";
cin>>n;
flag=N;
N=N+n;
for(int i=0;i>name[flag];
cout<<"数量:";
cin>>Avaliable[flag++];
}
showdata();
safe();
}
void delresources(){//删除资源
char ming;
int i,flag=1;
cout<<"请输入需要删除的资源名称:";
do{
cin>>ming;
for(i=0;i