简单银行家算法
最近在学操作系统,学习了银行家算法,要写一个简单的银行家算法程序:
银行家算法无非两个部分,一是安全性算法,另一个是银行家算法
此次的银行家算法基于这个要求:
分析T0时刻的代码(即安全性算法)
boolean JudgeSafe() { //判断是否安全
int i = 0,j=0;
for ( i = 0; i < 5; i++)
{
Finish[i] = false;
WorkSign[i].A = 0;
WorkSign[i].B = 0;
WorkSign[i].C = 0;
}
int step[5];
Work = Available;
for (i = 0; i<5; i++) {
if (Finish[i] == false) {
if (Work.A >= Need[i].A&&Work.B >= Need[i].B&&Work.C >= Need[i].C) {
WA[i].A = Work.A + Allocation[i].A;
WA[i].B = Work.B + Allocation[i].B;
WA[i].C = Work.C + Allocation[i].C;
WorkSign[j].A = Work.A;
WorkSign[j].B = Work.B;
WorkSign[j].C = Work.C;
step[j] = i;
j++;
Work.A = WA[i].A;
Work.B = WA[i].B;
Work.C = WA[i].C;
Finish[i] = true;
i = -1;
}
}
}
if (Finish[0]==true && Finish[1]==true && Finish[2] == true && Finish[3] == true && Finish[4] == true)
{
printf("Finish为0代表False,Finish为1代表True\n");
printf(" Work Need Allocation Work+Allocation Finish\n");
printf(" A B C A B C A B C A B C\n");
for (i = 0; i < 5; i++)
{
printf("P%d %2d %2d %2d %2d %2d %2d %2d %2d %2d %2d %2d %2d %5d\n", step[i], WorkSign[i].A, WorkSign[i].B, WorkSign[i].C,
Need[step[i]].A, Need[step[i]].B, Need[step[i]].C, Allocation[step[i]].A, Allocation[step[i]].B, Allocation[step[i]].C,
WA[step[i]].A, WA[step[i]].B, WA[step[i]].C, Finish[step[i]]);
}
printf("此时安全,序列为:");
for ( i = 0; i < 5; i++)
{
printf("P%d ",step[i]);
}
printf("\n");
return true;
}
else return false;
}
输入P1请求后的算法(即银行家算法)
void Bank() { //银行家算法线程请求
int a, b, c, d;
printf("请输入请求线程号P");
scanf("%d", &a);
printf("请输入request请求:\n");
scanf("%d %d %d", &b, &c, &d);
Change(a, { b,c,d });
if (JudgeSafe()) {
}
else {
printf("此时系统不安全!\n");
}
}
void Change(int i,Resource Request) { //更改请求线程信息
int j = 0;
for ( j = 0; j < 5; j++)
{
Finish[j] = false;
}
Available.A = Available.A - Request.A;
Available.B = Available.B - Request.B;
Available.C = Available.C - Request.C;
Allocation[i].A = Allocation[i].A + Request.A;
Allocation[i].B = Allocation[i].B + Request.B;
Allocation[i].C = Allocation[i].C + Request.C;
Need[i].A = Need[i].A - Request.A;
Need[i].B = Need[i].B - Request.B;
Need[i].C = Need[i].C - Request.C;
}
这些大概就是整个算法最核心的代码,有了这些就可实现此实验简单的银行家算法,代码的算法其实还不够完美,欢迎大家指正批评。
第一次写博客,有点慌乱,还请大家多多支持!
完整源码请注明来意,发邮件到1300527579@qq.com获取。