报告下载:地址。。(绝对原创,请勿抄袭)
(一)、程序功能:实现银行家算法
(二)、设计思路
设request:是Pi进程的请求向量,当Pi发了资源请求后,系统按下述步骤检查:
(1)如果Request[i]<= Need[i],则转向步骤(2)
(2)若Request[i] <=Available,则转向步骤(3);
(3)系统试探性地把要求的资源分配给进程Pi,并修改以下数据结构的值:
Available=Available-Request[i];
Allocation[i]= Allocation[i]+ Request[i];
Need[i]= Need[i]- Request[i];
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态,若安全,才正式将资源分配给Pi进程,完成本次分配;否则,试探性分配作废,恢复原来的资源分配状态,Pi进程进入等待状态。
(三)、数据结构
所用的的矩阵 | ||
类型 | 名字 | 注释 |
int | Available[3] | 可利用资源量 |
int | Alloc[5][3] | 分配矩阵 |
int | Need[5][3] | 需求矩阵 |
int | request[3] | 请求向量 |
相关函数 | |
声明 | 注释 |
bool compare(int *a, int *b… …) | 判断a、b向量的大小 |
bool SecurityCheck(int *Available… …) | 安全性检查 |
int main() | 主函数 |
(四)、算法设计
1、银行家算法流程图
2、安全性算法
(1) 设置两个工作向量:Work= Available;finish;
(2) 从进程集合中找到一个满足下述条件的进程:
finish ==false、need[i]<=Work;
如找到,执行(3) ; 否则,执行(4)
(3) 设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work+= Alloc[i]、Finish=true、GOTO(2)
(4) 如所有的进程Finish= true ,则表 示安全;否则系统不安全。
代码:
//安全性检查
bool SecurityCheck(int *Available, int Need[5][3], int Alloc[5][3])
{
bool finish[5] = { false,false,false,false,false };
int Work[3], i(0);
for (; i<3; i++)
Work[i] = Available[i]; //Work向量初始化
for (i = 0; i < 3; i++)
//寻找need<=Work并且未运行的进程
if (finish[i] == false&&compare(Need[i], Work, 3)) {
for (int j = 0; j < 3; j++)
Work[j] += Alloc[i][j]; //资源回收
finish[i] = true;
i = 0;
}
for (i = 0; i < 5; i++)
if (finish[i] == false) //存在不满足的进程
return false;
return true; //满足所有进程
}
(五)、程序运行情况
1、测试数据
m=3种类型的资源(A,B,C,) 进程个数n=5、Available=(2,3,3);
进程名 | 已分配资源 | 资源需求量 | ||||
A | B | C | A | B | C | |
P1 | 2 | 1 | 2 | 3 | 4 | 7 |
P2 | 4 | 0 | 2 | 1 | 3 | 4 |
P3 | 3 | 0 | 5 | 0 | 0 | 3 |
P4 | 2 | 0 | 4 | 2 | 2 | 1 |
P5 | 3 | 1 | 4 | 1 | 1 | 0 |
2、测试结果