分享
 
 
 

银行家算法实现

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

特别申明:转载一位大哥的程序

一.算法介绍:

**数据结构:

1.可利用资源向量Available

2.最大需求矩阵Max

3.分配矩阵Allocation

4.需求矩阵Need

**功能介绍:

模拟实现Dijkstra的银行家算法以避免死锁的出现.分两部分组成:

第一部分:银行家算法(扫描)

1.如果Request<=Need,则转向2;否则,出错

2.如果Request<=Available,则转向3,否则等待

3.系统试探分配请求的资源给进程

4.系统执行安全性算法

第二部分:安全性算法

1.设置两个向量

(1).工作向量:Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)

(2).Finish:表示系统是否有足够资源分配给进程(True:有;False:没有).初始化为False

2.若Finish[i]=False&&Need<=Work,则执行3;否则执行4(I为资源类别)

3.进程P获得第i类资源,则顺利执行直至完成!并释放资源:

Work=Work+Allocation;

Finish[i]=true;

转2

4. 若所有进程的Finish[i]=true,则表示系统安全;否则,不安全!

二.原代码及注释:

#include<iostream.h>

#include<fstream.h>

#include<stdlib.h>

#include "windows.h"

#define MAX_PROCESS 32 //最大进程数

#define MAX_COURCE 64 //最大资源类别

int MAX_FACT_PROCESS; //实际总进程数

int MAX_FACT_COURCE; //实际资源类别数

int Available[MAX_COURCE]; //可利用资源向量

int Max[MAX_PROCESS][MAX_COURCE]; //最大需求矩阵

int Allocation[MAX_PROCESS][MAX_COURCE]; //分配矩阵

int Need[MAX_PROCESS][MAX_COURCE]; //需求矩阵

int Request_PROCESS; //发出请求的进程

int Request_COURCE; //被请求资源类别

int Request_COURCE_NEMBER; //请求资源数

struct COMP{

int value;

int num;

int next;

};

int flag=0;

void Read_Initiate(void){ //读入初始化文档

ifstream infile("Initiate.txt");

if(!infile){

cout<<"不能打开输入文件:"<<"Initiate.txt"<<'\n';

exit(1);

}

cout<<"开始读入初始化文档"<<'\n';

int ch;

int Array[MAX_PROCESS*MAX_COURCE*2];

int num=0;

while(infile>>ch)

Array[num++]=ch;

num=0;

MAX_FACT_COURCE=Array[num++];

for(int j=0;j<MAX_FACT_COURCE;j++)

Available[j]=Array[num++];

MAX_FACT_PROCESS=Array[num++];

for(int i=0;i<MAX_FACT_PROCESS;i++){

for(int j=0;j<MAX_FACT_COURCE;j++)

Max[i][j]=Array[num++];

}

infile.close();

}

void Write_Initiate(void){ //写入初始化文档(分配资源

ofstream outfile("Initiate.txt");

if(!outfile){

cout<<"不能打开初始化文档:"<<'\n';

exit(1);

}

int Array[MAX_PROCESS*MAX_COURCE*2];

int num=0;

Array[num++]=MAX_FACT_COURCE;

for(int i=0;i<MAX_FACT_COURCE;i++)

Array[num++]=Available[i];

Array[num++]=MAX_FACT_PROCESS;

for(i=0;i<MAX_FACT_PROCESS;i++)

for(int j=0;j<MAX_FACT_COURCE;j++)

Array[num++]=Max[i][j];

num=0;

outfile<<Array[num++]<<" ";

for(i=0;i<MAX_FACT_COURCE;i++)

outfile<<Array[num++]<<" ";

outfile<<'\n'<<Array[num++]<<endl;

for(i=0;i<MAX_FACT_PROCESS;i++){

for(int j=0;j<MAX_FACT_COURCE;j++)

outfile<<Array[num++]<<" ";

outfile<<endl;

}

DWORD m_delay=3000;

Sleep(m_delay);

outfile.close();

cout<<"修改初始化文档成功!"<<endl;

}

void Allocated_list(void){ //读入已分配资源列表

ifstream infile("Allocated_list.txt");

if(!infile){

cout<<"不能打开输入文件:"<<"Allocated_list.txt"<<'\n';

exit(1);

}

cout<<"开始读入已分配资源列表"<<'\n';

int ch,num=0;

int Array[MAX_PROCESS*MAX_COURCE];

while(infile>>ch)

Array[num++]=ch;

num=0;

for(int i=0;i<MAX_FACT_PROCESS;i++)

for(int j=0;j<MAX_FACT_COURCE;j++)

Allocation[i][j]=Array[num++];

infile.close();

}

void Set_Need(void){ //设置需求矩阵

cout<<"设置需求矩阵"<<'\n';

for(int i=0;i<MAX_FACT_PROCESS;i++)

for(int j=0;j<MAX_FACT_COURCE;j++)

Need[i][j]=Max[i][j]-Allocation[i][j];

}

void Read_Request(void){ //读入请求向量

ifstream infile("Request_list.txt");

if(!infile){

cout<<"不能打开输入文件:"<<"Request_list.txt"<<'\n';

exit(1);

}

cout<<"开始读入请求向量"<<'\n';

int Array[3];

int num=0,ch;

while(infile>>ch)

Array[num++]=ch;

Request_PROCESS=Array[0];

Request_COURCE=Array[1];

Request_COURCE_NEMBER=Array[2];

infile.close();

}

void Write_Allocation(void){ //修改资源分配列表(资源分配)

ofstream outfile("Allocated_list.txt");

if(!outfile){

cout<<"不能打开资源分配列表:"<<'\n';

exit(1);

}

for(int i=0;i<MAX_FACT_PROCESS;i++){

for(int j=0;j<MAX_FACT_COURCE;j++)

outfile<<Allocation[i][j]<<" ";

outfile<<endl;

}

DWORD m_delay=3000;

Sleep(m_delay);

cout<<"修改资源分配列表成功!"<<endl;

outfile.close();

}

void Allocate_Source(void){ //开始分配(已通过扫描和安全性检测)

cout<<'\n'<<"开始给第"<<Request_PROCESS<<"个进程分配第"<<Request_COURCE

<<"类资源"<<Request_COURCE_NEMBER<<"个"<<endl;

Write_Initiate();

Write_Allocation();

DWORD m_delay=3000;

Sleep(m_delay);

cout<<'\n'<<"祝贺您,资源分配已成功!"<<endl;

}

void Test_Safty(){ //安全性检测

cout<<'\n'<<"进入安全性检测!"<<endl;

int Work[MAX_COURCE];

for(int i=0;i<MAX_FACT_COURCE;i++){

Work[i]=Available[i];

}

bool Finish[MAX_PROCESS][MAX_COURCE];

for(i=0;i<MAX_FACT_PROCESS;i++)

for(int j=0;j<MAX_FACT_COURCE;j++)

Finish[i][j]=false;

COMP Array[32];

for(i=0;i<MAX_FACT_PROCESS;i++)

{

Array[i].value=Need[i][Request_COURCE-1];

Array[i].num=i;

}

for(i=0;i<MAX_FACT_PROCESS;i++)

for(int j=i+1;j<MAX_FACT_PROCESS;j++){

if(Array[i].value>=Array[j].value){

int t;

t=Array[j].value;

Array[j].value=Array[i].value;

Array[i].value=t;

t=Array[j].num;

Array[j].num=Array[i].num;

Array[i].num=t;

}

else continue;

}

DWORD m_delay=3000;

Sleep(m_delay);

/*for(i=0;i<MAX_FACT_PROCESS;i++){

for(int j=0;j<MAX_FACT_COURCE;j++)

cout<<Need[i][j]<<'\t';

cout<<endl;

}

*/

if(Finish[Request_PROCESS-1][Request_COURCE-1]==false&&Need[Request_PROCESS-1][Request_COURCE-1]<=Work[Request_COURCE-1])

{

Work[Request_COURCE-1]=Work[Request_COURCE-1]+Allocation[Request_PROCESS-1][Request_COURCE-1];

Finish[Request_PROCESS-1][Request_COURCE-1]=true;

}

else

{

cout<<"未通过安全性测试,不与以分配"<<endl;

exit(0);

}

for(i=0;i<MAX_FACT_PROCESS;i++){

if(Array[i].num==Request_PROCESS-1)

continue;

if(Array[i].num!=Request_PROCESS-1&&Finish[Array[i].num][Request_COURCE-1]==false&&Need[Array[i].num][Request_COURCE-1]<=Work[Request_COURCE-1]){

Work[Request_COURCE-1]=Work[Request_COURCE-1]+Allocation[Array[i].num][Request_COURCE-1];

Finish[Array[i].num][Request_COURCE-1]=true;

}

}

for(i=0;i<MAX_FACT_PROCESS;i++)

{

if(Finish[i][Request_COURCE-1]==true)

continue;

else

{

cout<<"未通过安全性测试,不与以分配"<<endl;

exit(0);

}

}

cout<<'\n'<<"找到一个安全序列:"<<"P"<<Request_PROCESS<<"--->";

for(i=0;i<MAX_FACT_PROCESS;i++){

if(Array[i].num==Request_PROCESS)

continue;

else

cout<<"P"<<Array[i].num<<"--->";

}

cout<<'\n'<<"已通过安全性测试!"<<endl;

Allocate_Source();

}

void RUN(void){ //执行银行家算法

cout<<"*************************************************"<<'\n'<<"点击1执行!"

<<'\n'<<"点击2退出!"

<<'\n'<<"*************************************************"<<endl;

cin>>flag;

if(flag==2)

exit(0);

if(flag==1)

{

cout<<"开始扫描请求信息!"<<endl;

DWORD m_delay=3000;

Sleep(m_delay);

if(Request_COURCE_NEMBER>Need[Request_PROCESS-1][Request_COURCE-1])

{

cout<<'\n'<<"第"<<Request_PROCESS<<"个进程请求第"<<Request_COURCE<<"类资源"<<Request_COURCE_NEMBER<<"个"<<endl;

cout<<"可是已超出该进程尚需的该类资源的最大数量,所以不予以分配!!"<<endl;

exit(0);

}

if(Request_COURCE_NEMBER>Available[Request_COURCE-1])

{

cout<<'\n'<<"第"<<Request_PROCESS<<"个进程请求第"<<Request_COURCE<<"类资源"<<Request_COURCE_NEMBER<<"个"<<endl;

cout<<"可是系统中尚无足够的资源,所以进入等待队列!!"<<endl;

exit(0);

}

else{

Available[Request_COURCE-1]=Available[Request_COURCE-1]-Request_COURCE_NEMBER;

Allocation[Request_PROCESS-1][Request_COURCE-1]=Allocation[Request_PROCESS-1][Request_COURCE-1]+Request_COURCE_NEMBER;

Need[Request_PROCESS-1][Request_COURCE-1]=Need[Request_PROCESS-1][Request_COURCE-1]-Request_COURCE_NEMBER;

cout<<"扫描通过"<<endl;

Sleep(m_delay);

Test_Safty();

}

}

else {

cout<<"输入错误,请重新输入!"<<'\n';

RUN();

}

}

void main(void){

Read_Initiate();

cout<<MAX_FACT_COURCE<<'\t';

for(int i=0;i<MAX_FACT_COURCE;i++)

cout<<Available[i]<<'\t';

cout<<endl<<MAX_FACT_PROCESS<<endl;

for(i=0;i<MAX_FACT_PROCESS;i++){

for(int j=0;j<MAX_FACT_COURCE;j++)

cout<<Max[i][j]<<'\t';

cout<<endl;

}

DWORD m_delay=3000;

Sleep(m_delay);

cout<<"读入成功"<<'\n';

Allocated_list();

for(i=0;i<MAX_FACT_PROCESS;i++){

for(int j=0;j<MAX_FACT_COURCE;j++)

cout<<Allocation[i][j]<<'\t';

cout<<endl;

}

Sleep(m_delay);

cout<<"读入成功"<<'\n';

Set_Need();

for(i=0;i<MAX_FACT_PROCESS;i++){

for(int j=0;j<MAX_FACT_COURCE;j++)

cout<<Need[i][j]<<'\t';

cout<<endl;

}

Sleep(m_delay);

cout<<"设置成功"<<'\n';

Read_Request();

cout<<'\n'<<"第"<<Request_PROCESS<<"个进程请求第"<<Request_COURCE<<"类资源"<<Request_COURCE_NEMBER<<"个"<<endl;

cout<<'\n'<<"读入成功"<<'\n';

RUN();

}

三.数据测试

注:数组Array[I]表示第I+1个实际意义量

需要创建三个txt文本。

1.Initiate.txt文本

3 3 3 2 //共有3类资源,Available[0]=3; Available[1]=3; Available[2]=2

5 //当前系统中有个进程

7 5 3 // Max[0][0]=7

3 2 2 //Max[1][1]=3

9 0 2

2 2 2

4 3 3

2.Allocated_list.txt文本

0 1 0 //Allocation[0][1]=1

2 0 0

3 0 2

2 1 1

0 0 2

3.Request_list.txt文本

2 1 1 //第2个进程请求第1类资源1个Request[1][0]=1

四.程序说明:

本程序假设当前时刻只有一个进程请求某一类资源n个.

若要满足某个进程当前时刻同时请求不止一类资源,则需要为最大需求矩阵Max,分配矩阵Allocation和需求矩阵Need增加维数,当然代码量也将大大增加,但是算法逻辑本身并无变化.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有