用c语言模拟资源给进程分配的全过程,若资源随机分配,则有可能进入不安全状态从而形成死锁,银行家算法可以解决这一问题,并输出安全序列。
这里的随机算法其实就是自己决定分配多少,而非用伪随机种子生成。银行家算法,很简单的算法,学了操作系统的应该都知道了。
代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define os 10
using namespace std;
struct REC
{
int A;
int B;
int C;
};
struct PCB
{
int Id; //进程号,外部标识符
char State; //状态 R就绪 W等待 E完成
REC Apply; //当前请求量
REC Max; //需求总量
REC Need; //还需要资源数量
REC Allocation; //已分配量
};
PCB *pos,*tmp, *pos0;
REC System, Available;
PCB pcb[3];
/*void InitPCB()
{
printf("输入系统资源总量:\n");
scanf("%d%d%d", &System.A, &System.B, &System.C);
int i = 0, a = 0, b = 0, c = 0;
for(pos = pcb; pos < pcb+3; pos++)
{
i++;
pos->Id = i;
pos->State = 'R';
pos->Allocation.A = 0;
pos->Allocation.B = 0;
pos->Allocation.C = 0;
pos->Apply.B = 0;
pos->Apply.B = 0;
pos->Apply.B = 0;
}
i = 0;
for(pos = pcb; pos < pcb+3; pos++)
{
printf("输入进程%d最大需求Max\n", ++i);
scanf("%d%d%d", &pos->Max.A, &pos->Max.B, &pos->Max.C);
while(pos->Max.A>os || pos->Max.B>os || pos->Max.C>os || pos->Max.A<0 || pos->Max.B<0 || pos->Max.C<0)
{
printf("数据输入有错,请重新输入:\n");
scanf("%d%d%d", &pos->Max.A, &pos->Max.B, &pos->Max.C);
}
printf("输入进程%d已分配量\n", i);
scanf("%d%d%d", &pos->Allocation.A, &pos->Allocation.B, &pos->Allocation.C);
while(pos->Allocation.A>pos->Max.A || pos->Allocation.B>pos->Max.B || pos->Allocation.C>pos->Max.C || pos->Allocation.A<0 || pos->Allocation.B<0 || pos->Allocation.C<0)
{
printf("数据输入有错,请重新输入:\n");
scanf("%d%d%d", &pos->Allocation.A, &pos->Allocation.B, &pos->Allocation.C);
}
a+=pos->Allocation.A;
b+=pos->Allocation.B;
c+=pos->Allocation.C;
pos->Need.A = pos->Max.A-pos->Allocation.A;
pos->Need.B = pos->Max.B-pos->Allocation.B;
pos->Need.C = pos->Max.C-pos->Allocation.C;
}
Available.A = System.A-a;
Available.B = System.B-b;
Available.C = System.C-c;
}*/
void InitPCB()
{
// printf("输入系统资源总量:\n");
System.A = 10;
System.B = 5;
System.C = 7;
int i = 0, a = 0, b = 0, c = 0;
for(pos = pcb; pos < pcb+3; pos++)
{
i++;
pos->Id = i;
pos->State = 'R';
pos->Allocation.A = 0;
pos->Allocation.B = 0;
pos->Allocation.C = 0;
pos->Apply.B = 0;
pos->Apply.B = 0;
pos->Apply.B = 0;
}
i = 0;
//初始化第一个
pos = pcb;
pos->Max.A = 7;
pos->Max.B = 5;
pos->Max.C = 3;
pos->Allocation.A = 0;
pos->Allocation.B = 1;
pos->Allocation.C = 3;
a+=pos->Allocation.A;
b+=pos->Allocation.B;
c+=pos->Allocation.C;
pos->Ne