#include<stdio.h>
#define MAX 10
int available[MAX]; //可利用资源数
int max[MAX][MAX];//最大需求矩阵
int allocation[MAX][MAX];//分配矩阵
int need[MAX][MAX]; //需求矩阵
int request[MAX]; //请求资源量
int work[MAX]; //可利用资源量
int finish[MAX]; //进程完成标志
int J[MAX] = { 0 };//跳过进程标记
//安全性算法
int safety(int m, int n)//m进程数,n资源种类数
{
int i, j, k, l, flag;
int safe[MAX] = { 0 };//安全序列
int count = 0; //安全序列个数
for (i = 0; i < m; i++) {
finish[i] = 0; //初始化完成标志
work[i] = available[i]; //可利用资源量初始化
}
while (1)
{
flag = 0; //完成标志
for (j = 0; j < m; j++) {
if (finish[j] == 0) //未完成进程
{
for (k = 0; k < n; k++)
{
if (need[j][k] > work[k]) //判断资源是否满足
break;
}
if (k == n) //资源满足
{
for (l = 0; l < n; l++)
work[l] += allocation[j][l];//更新可利用资源量
safe[count] = j; //加入安全序列
count++;
finish[j] = 1; //更新完成标志
flag = 1;
//更新完成标志
}
}
} if (flag == 0) //无进程可运行
break;
} if (count == m) //进程完成
{
printf("安全序列为:");
for (i = 0; i < m; i++)
printf("P%d ", safe[i]);
printf("\n安全\n");
return 1;
}
else //不安全
{
printf("不安全\n");
return 0;
}
}
//请求资源
int requestResource(int p, int m, int n)//m进程数,n资源种类数
{
int i, j, k; //判断请求资源是否满足
for (i = 0; i < n; i++)
{
if (request[i] > need[p][i])
{
printf("请求资源数大于所需资源数,请重新输入\n");
return 0;
}
} //判断请求资源是否满足
for (j = 0; j < n; j++)
{
if (request[j] > available[j])
{
printf("请求资源数大于可利用资源数,请重新输入\n");
return 0;
}
} //满足请求
if (safety(m, n) == 1)
{
for (k = 0; k < n; k++)
{
available[k] -= request[k]; //更新可利用资源量
allocation[p][k] += request[k]; //更新分配矩阵
need[p][k] -= request[k]; //更新需求矩阵 }
}
}
if (safety(m, n) != 1) //安全性算法撤销操作
{
for (k = 0; k < n; k++)
{
available[k] += request[k]; //更新可利用资源量
allocation[p][k] -= request[k]; //更新分配矩阵
need[p][k] += request[k]; //更新需求矩阵 }
}
printf("已撤销操作\n");
}
}
int main()
{
int i, j, m, n, p;
int projectsum[MAX] = { 0 };
int loop = 1;
printf("请输入进程数:");
scanf_s("%d", &m);
printf("请输入资源种类数:");
scanf_s("%d", &n);
for (i = 0; i < n; i++)
{
printf("请输入可利用资源数%d:", i + 1);
scanf_s("%d", &available[i]);
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("请输入最大需求矩阵[%d][%d]:\n", i, j);
scanf_s("%d", &max[i][j]);
}
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("请输入已分配矩阵[%d][%d]:\n", i, j);
scanf_s("%d", &allocation[i][j]); //计算需求矩阵
}
}
printf("\n");
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
need[i][j] = max[i][j] - allocation[i][j];
}
}
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
projectsum[i] = projectsum[i] + allocation[j][i];
}
projectsum[i] = available[i] + projectsum[i];
}
printf("\tMAX\t Allocation\t Need\n");
for (i = 0; i < m; i++)
{
for (j = 0; j < n - 1; j++)
{
printf("P%d|%d\t%d\t|%d\t%d\t|%d\t%d\t|", i, max[i][j], max[i][j + 1], allocation[i][j], allocation[i][j + 1], need[i][j], need[i][j + 1]);
}
printf("\n");
}
while (loop)
{
safety(m, n);
for (i = 0; i < n; i++)
{
printf("资源%d可分配:%d\t,", i + 1, available[i]);
printf("资源%d总数:%d\n", i + 1, projectsum[i]);
}
printf("\n");
printf("请输入申请内存进程的数字:\n");
scanf_s("%d", &p);
for (i = 0; i < n; i++)
{
printf("请输入对资源%d申请的资源数", i + 1);
scanf_s("%d", &request[i]);
}
requestResource(p, m, n); //请求资源
printf("输入0退出,输入1继续");
scanf_s("%d", &loop);
printf("\tMAX\t Allocation\t Need\n");
for (i = 0; i < m; i++)
{
for (j = 0; j < n - 1; j++)
{
if (need[i][j] == 0 && need[i][j + 1] == 0 && J[i] == 0)
{
available[j] += max[i][j];
available[j + 1] += max[i][j + 1];
J[i] = 1;
continue;
}
if (need[i][j] == 0 && need[i][j + 1] == 0)
{
continue;
}
else
printf("P%d|%d\t%d\t|%d\t%d\t|%d\t%d\t|", i, max[i][j], max[i][j + 1], allocation[i][j], allocation[i][j + 1], need[i][j], need[i][j + 1]);
}
printf("\n");
}
}
return 0;
}