银行家算法C++代码实现

  • 格式:docx
  • 大小:182.99 KB
  • 文档页数:14

下载文档原格式

  / 14
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编号:

武汉大学计算机学院

课程实验(设计)报告

专业(班):计算机科学与技术计科6班

学号:*************

*名:**

课程名称:操作系统设计

任课教师:**

2015年12 月22日

银行家算法实现

一、实习内容

编写实现银行家算法,实现资源的安全分配。

通过本实验熟悉银行家算法,对预防死锁有更深刻的认识。

二、实习题目

初始状态下,设置数据结构存储可利用资源向量(Available),最大需求矩阵(MAX),分配矩阵(Allocation),需求矩阵(Need),输入待分配进程队列和所需资源。

设计安全性算法,设置工作向量表示系统可提供进程继续运行的可利用资源数目。

如果进程队列可以顺利执行打印输出资源分配情况,如果进程队列不能顺利执行打印输出分配过程,提示出现死锁位置。

三、设计思想

数据结构

class process //定义进程

{

public :

bool finish = false; //完成状态

int need[max_resources]; //还需要分配的资源

int allocation[max_resources]; //已经分配的资源

int max_need[max_resources]; //最大需求量

int request[max_resources]; //本次需求量

public:

process(int_need[max_resources], int_allocation[max_resources], int

_max_need[max_resources])

{

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

{

need[i] = _need[i];

allocation[i] = _allocation[i];

max_need[i] = _max_need[i];

}

}

//构造函数

void set(int_need[max_resources], int_max_need[max_resources])

{

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

{

need[i] = _need[i];

allocation[i] = 0;

max_need[i] = _max_need[i];

}

} //赋值函数

process()

{

}

};

主要函数

(1)bool check_safe(int work[max_process], process my_process[max_process]) //安全性算法

(2)bool destribute(int available[max_resources], process the_process, process

my_process[max_process]) //是否分配空间成功的算法

(3) void init(int available[max_resources], process my_process[max_process]) //

初始化函数

Main函数

int main()

{

int _need[max_resources];

int _allocation[max_resources];

int available[max_resources];

process my_process[max_process];

int i,j;

int choice=1;

init( available, my_process);

while (true)

{

cout <<" 选项\n 1:继续分配\n 2:查看当前available资源数\n其他字符:退出\n";

scanf_s("%d", &choice);

switch (choice)

{ case 1:

{

cout <<"请输入本次请求分配给第i个进程的资源,格式:进程号 xx xx xx xx,空

格隔开"<< endl;

scanf_s("%d", &i);

for (j = 0; j < max_resources; j++)

{

scanf_s("%d", &my_process[i].request[j]);

}

if (destribute(available, my_process[i], my_process) == true)

{

cout <<"此次destribute成功"<< endl;

}

else cout <<"此次destribute不成功"<< endl;

}

break;

case 2:

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

cout <<"第"<< i <<"个资源还剩"<< available[i] <<"个\n";

break;

}

default: break;

}

}

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

cin.get();

return 0;

}银行家算法操作部分

银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。

设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。 (1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出错。

(2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],则转(3);否则,出错。

(3)系统试探分配资源,修改相关数据:

AVAILABLE[i]-=REQUEST[cusneed][i];

ALLOCATION[cusneed][i]+=REQUEST[cusneed][i]; NEED[cusneed][i]-=REQUEST[cus need][i];

(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原

状,进程等待。

安全性算法检验部分

1)设置两个工作向量Work=AVAILABLE;FINISH (2)从进程集合中找到一个满足下述条件的进程,

FINISH==false; NEED<=Work;

如找到,执行(3);否则,执行(4)