#define M 100
#include<stdio.h>
int max[M][M], allocation[M][M], need[M][M], available[M];
int i, j, n, m, r;
void testout()// 算法安全性的检测
{
int k, flag, v = 0;
int work[M], a[M];
char finish[M];
r = 1;
for (i = 0; i < n; i++)
finish[i] = 'F';// 初始化各进程均没得到足够资源
for (j = 0; j < m; j++)
work[j] = available[j];// 用work[j]表示可提供进程继续运行的各类资源数
//
// k=n;
while (k > 0)
{
for (i = 0; i < n; i++)
{
if (finish[i] == 'F')
{
flag = 1;
for (j = 0; j < m; j++)
if (need[i][j] > work[j])
flag = 0;
if (flag == 1)// 找到还没完成的且需求数小于可提供进程继续运行的
{
finish[i] = 'T';// 资源数的进程
a[v++] = i;// 记录安全序列
for (j = 0; j < m; j++)
work[j] = work[j] + allocation[i][j];// 释放该进程已分配的资源
}
}
}
k--;
}
flag = 1;
for (i = 0; i < n; i++)// 判断是否所有的进程都完成
if (finish[i] == 'F')
flag = 0;
if (flag == 0)// 若有进程没完成,则为不安全状态
{
printf("系统不安全 . \n");
r = 0;
}
else// 否则为安全状态
{
printf("系统是安全的 .\n");
printf(" 输出安全序列:\n");
for (i = 0; i < n; i++)
printf("%d ", a[i]);// 输出安全序列
printf("\n");
for (i = 0; i < n; i++)
{
printf("%2d", i);
printf(" ");
for (j = 0; j < m; j++)
printf("%2d", allocation[i][j]);
printf(" ");
for (j = 0; j < m; j++)
printf("%2d", need[i][j]);
printf("\n");
}
}
}
void print()// 输出可用资源数目
{
printf("可用资源是: \n");
for (j = 0; j < m; j++)
printf("%2d ", available[j]);
printf("\n");
}
main()
{
int p, q;
int request[M], allocation1[M][M], need1[M][M], available1[M];
printf("输入进程总数:\n");
scanf("%d", &n);
printf("输入资源种类总数 :\n");
scanf("%d", &m);
printf("输入最大矩阵 :\n");
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
scanf("%2d", &max[i][j]);
printf("输入已分配资源数:\n");
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
scanf("%d", &allocation[i][j]);
printf("输出还需要的资源数:\n");
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
need[i][j] = max[i][j] - allocation[i][j];
}
printf("%d", need[i][j]);
printf("\n");
}
printf("\n输入可用资源数:\n");
for (i = 0; i < m; i++)
scanf("%d", &available[i]);
testout();// 检测已知的状态是否安全 if (r==1)
//
// //如果状态安全则执行以下代码
{
while (1)
{
p = 0;
q = 0;
printf("\n输入请求资源的进程号: \n");
scanf("%d", &i);
printf("输入该进程所需的资源数:\n");
for (j = 0; j < m; j++)
scanf("%d", &request[j]);
for (j = 0; j < m; j++)
if (request[j] > need[i][j])
p = 1;// 判断是否超过最大资源数
if (p)
printf("请求超过最大资源数!\n");
else
{
for (j = 0; j < m; j++)
if (request[j] > available[j])
q = 1;// 判断是否超过可用资源数
if (q)
printf("没有足够的可用资源!\n");
else
{
for (j = 0; j < m; j++)
{
available1[j] = available[j];// 保存原已分配的资源数,需要的资源数,和可用的资源数
allocation1[i][j] = allocation[i][j];
need1[i][j] = need[i][j];
available[j] = available[j] - request[j];// 系统尝试把资源分配给请求的进程
allocation[i][j] = allocation[i][j] + request[j];
need[i][j] = need[i][j] - request[j];
}
print();// 输出可用资源数
testout();// 进行安全检测
if (r == 0)// 分配后状态不安全
{
for (j = 0; j < m; j++)
{
available[j] = available1[j];// 还原分配前的已分配的资
//
// 源数,仍需要的资源数和可用的资源数
allocation[i][j] = allocation1[i][j];
need[i][j] = need1[i][j];
}
printf(" 不安全,请返回!\n");
print();
}
}
}
}
}
}
#include<stdio.h>
int max[M][M], allocation[M][M], need[M][M], available[M];
int i, j, n, m, r;
void testout()// 算法安全性的检测
{
int k, flag, v = 0;
int work[M], a[M];
char finish[M];
r = 1;
for (i = 0; i < n; i++)
finish[i] = 'F';// 初始化各进程均没得到足够资源
for (j = 0; j < m; j++)
work[j] = available[j];// 用work[j]表示可提供进程继续运行的各类资源数
//
// k=n;
while (k > 0)
{
for (i = 0; i < n; i++)
{
if (finish[i] == 'F')
{
flag = 1;
for (j = 0; j < m; j++)
if (need[i][j] > work[j])
flag = 0;
if (flag == 1)// 找到还没完成的且需求数小于可提供进程继续运行的
{
finish[i] = 'T';// 资源数的进程
a[v++] = i;// 记录安全序列
for (j = 0; j < m; j++)
work[j] = work[j] + allocation[i][j];// 释放该进程已分配的资源
}
}
}
k--;
}
flag = 1;
for (i = 0; i < n; i++)// 判断是否所有的进程都完成
if (finish[i] == 'F')
flag = 0;
if (flag == 0)// 若有进程没完成,则为不安全状态
{
printf("系统不安全 . \n");
r = 0;
}
else// 否则为安全状态
{
printf("系统是安全的 .\n");
printf(" 输出安全序列:\n");
for (i = 0; i < n; i++)
printf("%d ", a[i]);// 输出安全序列
printf("\n");
for (i = 0; i < n; i++)
{
printf("%2d", i);
printf(" ");
for (j = 0; j < m; j++)
printf("%2d", allocation[i][j]);
printf(" ");
for (j = 0; j < m; j++)
printf("%2d", need[i][j]);
printf("\n");
}
}
}
void print()// 输出可用资源数目
{
printf("可用资源是: \n");
for (j = 0; j < m; j++)
printf("%2d ", available[j]);
printf("\n");
}
main()
{
int p, q;
int request[M], allocation1[M][M], need1[M][M], available1[M];
printf("输入进程总数:\n");
scanf("%d", &n);
printf("输入资源种类总数 :\n");
scanf("%d", &m);
printf("输入最大矩阵 :\n");
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
scanf("%2d", &max[i][j]);
printf("输入已分配资源数:\n");
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
scanf("%d", &allocation[i][j]);
printf("输出还需要的资源数:\n");
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
need[i][j] = max[i][j] - allocation[i][j];
}
printf("%d", need[i][j]);
printf("\n");
}
printf("\n输入可用资源数:\n");
for (i = 0; i < m; i++)
scanf("%d", &available[i]);
testout();// 检测已知的状态是否安全 if (r==1)
//
// //如果状态安全则执行以下代码
{
while (1)
{
p = 0;
q = 0;
printf("\n输入请求资源的进程号: \n");
scanf("%d", &i);
printf("输入该进程所需的资源数:\n");
for (j = 0; j < m; j++)
scanf("%d", &request[j]);
for (j = 0; j < m; j++)
if (request[j] > need[i][j])
p = 1;// 判断是否超过最大资源数
if (p)
printf("请求超过最大资源数!\n");
else
{
for (j = 0; j < m; j++)
if (request[j] > available[j])
q = 1;// 判断是否超过可用资源数
if (q)
printf("没有足够的可用资源!\n");
else
{
for (j = 0; j < m; j++)
{
available1[j] = available[j];// 保存原已分配的资源数,需要的资源数,和可用的资源数
allocation1[i][j] = allocation[i][j];
need1[i][j] = need[i][j];
available[j] = available[j] - request[j];// 系统尝试把资源分配给请求的进程
allocation[i][j] = allocation[i][j] + request[j];
need[i][j] = need[i][j] - request[j];
}
print();// 输出可用资源数
testout();// 进行安全检测
if (r == 0)// 分配后状态不安全
{
for (j = 0; j < m; j++)
{
available[j] = available1[j];// 还原分配前的已分配的资
//
// 源数,仍需要的资源数和可用的资源数
allocation[i][j] = allocation1[i][j];
need[i][j] = need1[i][j];
}
printf(" 不安全,请返回!\n");
print();
}
}
}
}
}
}