银行家算法C++代码实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)