银行家算法是一种用于避免系统死锁的资源分配和调度算法。该算法通过模拟资源分配过程,判断系统是否处于安全状态,如果处于安全状态,则允许资源的分配,否则拒绝分配并还原已分配的资源。课设旨在实现一个银行家算法的系统,以解决多进程或多线程系统中的资源分配和调度问题。
数据结构
a.可利用资源向量Available。这是一个含有m元素的数组,其中的每元素代表类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目其数值随该类资源的分配和回收而动态地改变。如果Available[j]=K,则表示系统中现有Rj类资源K个。
b.最大需求矩阵Max。这是一个n×m的矩阵,它定义了系统中n个进程中的每 进程对m类资源的最大需求。如果Max[i][j]=K,则表示进程i需要Rj类资源的最大数目为K。
c.分配矩阵Allocation。这也是个n×m的矩阵定义了系统中每类资源当前已分配给进程的资源数。如果Allocation[i][j]=K,则表示进程i当前已分得Rj类资源的数目为K。
d.需求矩阵Need。是个n×m的矩阵,用以表示进程尚需的各类资源数。如果Need[i][j]=K,则表示进程i还需要Rj类资源K个能完成任务。
三者关系为:Need[i][j]=Max[i][j]-Allocation[i][j]
安全性算法
先设置向量Work,用于表示系统可提供给进程继续运行所需的各类资源数目,它含有m种元素,在执行安全算法开始时,Work=Available;标志向量Finish,它表示系统是否有足够的资源分配给进程使之运行完成。开始时先将初始值false赋给Finish;当有足够资源分配给进程时再令Finish[i] =true。
第二步,从进程集合中按顺序遍历,找到一个进程同时满足以下两个条件:
①Finish[i]=false;
②Need[i,j]<=Work[i];
若找到,执行步骤A,否则执行步骤B。
A)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行Work[j]=Work[j] + Allocation[i,j];Finish[i]=true;跳转回第二步。
B)如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。
银行家算法模块
设Request[i]是进程Pi的请求向量如果Requesti[j]=K,表示进程Pi需要K个Rj类型的资源。
当Pi发出资源请求后,系统按下述步骤进行检查:
(1)如果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];
系统设计
数据结构定义:
const int MAX_RESOURCES = 3;
const int MAX_PROCESSES = 5;
int Available[MAX_RESOURCES];
int Max[MAX_PROCESSES][MAX_RESOURCES]; //一个二维整数数组,用于存储每个进程所需的最大资源数量。
int Allocation[MAX_PROCESSES][MAX_RESOURCES]; //一个二维整数数组,用于存储每个进程已分配的资源数量。
int Need[MAX_PROCESSES][MAX_RESOURCES];//一个二维整数数组,用于存储每个进程仍需分配资源数量。
int Work[MAX_PROCESSES];
bool Finish[MAX_PROCESSES]; //一个布尔型数组,用于标记每个进程是否已完成。
int Security[100] = { 0 }; //存放安全序列
int Request[100] = { 0 }; //请求资源向量
类定义
class BankersAlogrithm {
public:
//构造函数
BankersAlogrithm();
//展示菜单
void ShowMenu();
//退出系统
void ExitSystem();
//资源分配初始化
void ResourceInti();
//打印资源情况表
void RP_TAB();
//安全性算法
int safe();
//银行家算法
void Banker();
};
函数定义
//BankersAlogrithm构造函数
BankersAlogrithm::BankersAlogrithm()
//展示菜单函数
void BankersAlogrithm::ShowMenu()
//退出系统函数
void BankersAlogrithm::ExitSystem()
//子菜单函数
void Submenu()
//获取资源类型和进程数
void GetRP()
//输入Avalanche矩阵函数
void InputAvailable()
//输入Max矩阵函数
void InputMax()
//输入Allocation矩阵函数
void InputAllocation()
//资源情况表
void BankersAlogrithm::RP_TAB()
//资源分配初始化函数
void BankersAlogrithm::ResourceInti()
//安全性算法
int BankersAlogrithm::safe()
//尝试分配资源
int test(int i)//试探性的将资源分配给第i个进程
//试探性分配资源作废
int Retest(int i) //与test操作相反
//银行家算法
void BankersAlogrithm::Banker();