#include <stdio.h>
int curr[5][5], maxclaim[5][5], avl[5];
int alloc[5] = {0, 0, 0, 0, 0};//已分配的资源
int maxres[5], running[5], safe=0;
int count = 0, i, j, exec, r, p, k = 1;
void main()
{
printf("\n请输入进程的个数: ");
scanf("%d", &p);
for (i = 0; i < p; i++) {
running[i] = 1;//i进程运行
count++;//进程运行个数
}
printf("\n请输入资源数目: ");
scanf("%d", &r);
printf("\n请输入各资源的数量:");
for (i = 0; i < r; i++) {
scanf("%d", &maxres[i]);
}
printf("\n请输入已分配的资源表:\n");
for (i = 0; i < p; i++) {
for(j = 0; j < r; j++) {
scanf("%d", &curr[i][j]);
}
}
printf("\n请输入最大资源表:\n");
for (i=0; i<p;i++) {
for(j=0;j<r;j++) {
scanf("%d", &maxclaim[i][j]);
}
}
printf("\n各资源数量为s: ");
for (i = 0; i < r; i++) {
printf("\t%d", maxres[i]);
}
printf("\n已分配的资源表为:\n");
for (i = 0; i < p; i++) {
for (j = 0; j < r; j++) {
printf("\t%d", curr[i][j]);//输出已分配的资源
}
printf("\n");
}
printf("\n最大资源表为:\n");
for (i = 0; i < p; i++) {//p进程个数
for (j = 0; j < r; j++) {//r资源个数
printf("\t%d", maxclaim[i][j]);//输出最大资源表
}
printf("\n");
}
for (i = 0; i < p; i++) {
for (j = 0; j < r; j++) {
alloc[j] += curr[i][j];//一共分配了多少
}
}
printf("\n已分配的资源:");
for (i = 0; i < r; i++) {
printf("\t%d", alloc[i]);//输出一共分配了多少资源
}
for (i = 0; i < r; i++) {
avl[i] = maxres[i] - alloc[i];//ke利用的资源 available
}
printf("\n可利用的资源:");
for (i = 0; i < r; i++) {
printf("\t%d", avl[i]);//输出可利用的资源
}
printf("\n");
//Main procedure goes below to check for unsafe state.
while (count != 0) {//有进程执行
safe = 0;//初始化进程不安全
for (i = 0; i < p; i++) {
if (running[i]) {
exec = 1;
for (j = 0; j < r; j++) {
if (maxclaim[i][j] - curr[i][j] > avl[j]) {
exec = 0;//需要的资源大于可利用的资源不能执行
break;
}
}
if (exec) {
printf("\n进程%d 正在运行\n", i + 1);
running[i] = 0;
count--;//运行个数减一
safe = 1;//处于安全状态
for (j = 0; j < r; j++) {
avl[j] += curr[i][j];//更新可利用的资源
}
break;
}
}
}
if (!safe) {
printf("\n该进程不安全.\n");
break;
} else {
printf("\n该进程安全");
printf("\n可利用的资源为:");
for (i = 0; i < r; i++) {
printf("\t%d", avl[i]);
}
printf("\n");
}
}
}
/*SAMPLE OUTPUT
-----------------
Enter the number of processes:5 进程个数
Enter the number of resources:4 资源数量
Enter Claim Vector:8 5 9 7 输入各种资源的数量
Enter Allocated Resource Table:输入已分配的资源表
2 0 1 1
0 1 2 1
4 0 0 3
0 2 1 0
1 0 3 0
Enter Maximum Claim Table:输入最大量
3 2 1 4
0 2 5 2
5 1 0 5
1 5 3 0
3 0 3 3
The Claim Vector is: 8 5 9 7
The Allocated Resource Table:
2 0 1 1
0 1 2 1
4 0 0 3
0 2 1 0
1 0 3 0
The Maximum Claim Table:
3 2 1 4
0 2 5 2
5 1 0 5
1 5 3 0
3 0 3 3
Allocated resources: 7 3 7 5已分配的资源
Available resources: 1 2 2 2可用的资源
Process3 is executing
The process is in safe state
Available vector: 5 2 2 5
Process1 is executing
The process is in safe state
Available vector: 7 2 3 6
Process2 is executing
The process is in safe state
Available vector: 7 3 5 7
Process4 is executing
The process is in safe state
Available vector: 7 5 6 7
Process5 is executing
The process is in safe state
Available vector: 8 5 9 7
---------------------------------------------------------*/