//如果是用dev c++编程 Ctrl+Shift+A可将代码自动调整为方便阅读状态。首先要选中(Ctrl+A)代码
#include<stdio.h>
#define M 50
int max[M][M];
int allocation[M][M];
int need[M][M];
int available[M];//以上用于建立二维数组
int i, j, m, n, safety,x=0;
/*i用于行方向的操作,j用于列方向的操作;
m用于行指明进程,n用于列指明各类资源。
safety是是否存在安全队列的标志
x用到时再说*/
main() {
void check();
int p,q,control;
int req[M],allocation1[M][M],need1[M][M],available1[M];
//req是你的请求分配,allocation1,need1,available1用于保存请求前的各状态,用于请求不合法时恢复数据
printf("输入进程总数:");
scanf("%d", &m);
printf("输入资源种类数量:");
scanf("%d", &n);
printf("输入需求矩阵Max:\m");
for(i=0; i<m; i++)
for(j=0; j<n; j++)
scanf("%2d",&max[i][j]);
printf("输入已分配矩阵Allocation:\m");
for(i=0; i<m; i++)
for(j=0; j<n; j++)
scanf("%d", &allocation[i][j]);
for (i=0; i<m; i++)
for(j=0; j<n; j++)
need[i][j]=max[i][j]-allocation[i][j];
printf("输入资源的系统初始值:\m");
for (j=0; j<n; j++)
scanf("%d", &available[j]);
for (j=0; j<n; j++)
for(i=0; i<m; i++)
available[j]=available[j]-allocation[i][j];
//以上是对数据的输入
check();//检测安全序列
if (safety==1) //如果已知的状态安全则执行以下代码
for(control=0;; control++) {
p=0,q=0;
printf("\m输入请求的进程号: ");
scanf("%d", &i);
printf("输入该进程的请求资源数组:");
for(j=0; j<n; j++)
scanf("%d",&req[j]);
for(j=0; j<n; j++)
if(req[j]>need[i][j])
p=1;
if(p)
printf("请求资源大于该进程还需要的资源!\m");
else {
for(j=0; j<n; j++)
if(req[j]>available[j])//判断请求是否大于可用资源
q=1;
if(q)
printf("可用资源不能满足请求!\m");
else {
for(j=0; j<n; j++) { //满足两大条件
available1[j]=available[j]; //保持资源的当前
allocation1[i][j]=allocation[i][j];
need1[i][j]=need[i][j];
available[j]=available[j]-req[j]; //尝试把资源分配给进程
allocation[i][j]=allocation[i][j]+req[j];
need[i][j]=need[i][j]-req[j];
if(need[i][j]==0)
x=x+1; //当进程满足时释放资源
}
if(x==n)
for(j=0; j<n; j++) {
available[j]=available[j]+allocation[i][j];
allocation[i][j]=0;
available1[j]=available[j];
x--;
}
else x=0;
check();
if(safety==0) {
for (j=0; j<n; j++) {
available[j]=available1[j]; //还原分配前的状态
allocation[i][j]=allocation1[i][j];
need[i][j]=need1[i][j];
}
printf("执行该进程不安全!返回继续操作。\m");
}
}
}
printf("是否继续请求?\m");
}
}
void check() { //安全性算法
int k, f, num=0;
int work[M],a[M];
char finish[M];
safety=1;
for(i=0; i<m; i++)
finish[i]='F';
for(j=0; j<n; j++)
work[j]=available[j];
k=m;
do {
for (i=0; i<m; i++) {
if (finish[i]=='F') {
f=1;
for (j=0; j<n; j++)
if (need[i][j]>work[j])
f=0;
if (f==1) { //找到还没完成的且需求数小于可提供进程继续运行的
finish[i]='T';
a[num++]=i; //记录安全序列号
for (j=0; j<n; j++)
work[j]=work[j]+allocation[i][j]; //释放该进程已分配的资源
available[j] =work[j];
}
}
}
k--;
} while(k>0);
f=1;
for (i=0; i<m; i++) { //判断有没有进程没完成
if (finish[i]=='F') {
f=0;
break;
}
}
if(f==0) {
printf("不安全状态!\m");
safety=0;
} else {
printf("处于安全状态.");
printf("安全序列号:");
for (i=0; i<m; i++)
printf ("%d ",a[i]);
printf("\m");
printf("进程");
printf(" ");
printf(" M a x ");
printf(" ");
printf("allocation");
printf(" ");
printf("need");
printf(" ");
printf("available");
printf("\m");
for (i=0; i<m; i++) {
printf("%2d",i);
printf(" ");
for(j=0; j<n; j++)
printf("%2d",max[i][j]);
printf(" ");
for(j=0; j<n; j++)
printf("%2d",allocation[i][j]);
printf(" ");
for(j=0; j<n; j++)
printf("%2d",need[i][j]);
printf(" ");
for(j=0; j<n; j++) {
if(i>0) break;
printf("%2d",available[j]);
}
for(j=0; j<n; j++) {
printf("\m");
}
}
}
}
#include<stdio.h>
#define M 50
int max[M][M];
int allocation[M][M];
int need[M][M];
int available[M];//以上用于建立二维数组
int i, j, m, n, safety,x=0;
/*i用于行方向的操作,j用于列方向的操作;
m用于行指明进程,n用于列指明各类资源。
safety是是否存在安全队列的标志
x用到时再说*/
main() {
void check();
int p,q,control;
int req[M],allocation1[M][M],need1[M][M],available1[M];
//req是你的请求分配,allocation1,need1,available1用于保存请求前的各状态,用于请求不合法时恢复数据
printf("输入进程总数:");
scanf("%d", &m);
printf("输入资源种类数量:");
scanf("%d", &n);
printf("输入需求矩阵Max:\m");
for(i=0; i<m; i++)
for(j=0; j<n; j++)
scanf("%2d",&max[i][j]);
printf("输入已分配矩阵Allocation:\m");
for(i=0; i<m; i++)
for(j=0; j<n; j++)
scanf("%d", &allocation[i][j]);
for (i=0; i<m; i++)
for(j=0; j<n; j++)
need[i][j]=max[i][j]-allocation[i][j];
printf("输入资源的系统初始值:\m");
for (j=0; j<n; j++)
scanf("%d", &available[j]);
for (j=0; j<n; j++)
for(i=0; i<m; i++)
available[j]=available[j]-allocation[i][j];
//以上是对数据的输入
check();//检测安全序列
if (safety==1) //如果已知的状态安全则执行以下代码
for(control=0;; control++) {
p=0,q=0;
printf("\m输入请求的进程号: ");
scanf("%d", &i);
printf("输入该进程的请求资源数组:");
for(j=0; j<n; j++)
scanf("%d",&req[j]);
for(j=0; j<n; j++)
if(req[j]>need[i][j])
p=1;
if(p)
printf("请求资源大于该进程还需要的资源!\m");
else {
for(j=0; j<n; j++)
if(req[j]>available[j])//判断请求是否大于可用资源
q=1;
if(q)
printf("可用资源不能满足请求!\m");
else {
for(j=0; j<n; j++) { //满足两大条件
available1[j]=available[j]; //保持资源的当前
allocation1[i][j]=allocation[i][j];
need1[i][j]=need[i][j];
available[j]=available[j]-req[j]; //尝试把资源分配给进程
allocation[i][j]=allocation[i][j]+req[j];
need[i][j]=need[i][j]-req[j];
if(need[i][j]==0)
x=x+1; //当进程满足时释放资源
}
if(x==n)
for(j=0; j<n; j++) {
available[j]=available[j]+allocation[i][j];
allocation[i][j]=0;
available1[j]=available[j];
x--;
}
else x=0;
check();
if(safety==0) {
for (j=0; j<n; j++) {
available[j]=available1[j]; //还原分配前的状态
allocation[i][j]=allocation1[i][j];
need[i][j]=need1[i][j];
}
printf("执行该进程不安全!返回继续操作。\m");
}
}
}
printf("是否继续请求?\m");
}
}
void check() { //安全性算法
int k, f, num=0;
int work[M],a[M];
char finish[M];
safety=1;
for(i=0; i<m; i++)
finish[i]='F';
for(j=0; j<n; j++)
work[j]=available[j];
k=m;
do {
for (i=0; i<m; i++) {
if (finish[i]=='F') {
f=1;
for (j=0; j<n; j++)
if (need[i][j]>work[j])
f=0;
if (f==1) { //找到还没完成的且需求数小于可提供进程继续运行的
finish[i]='T';
a[num++]=i; //记录安全序列号
for (j=0; j<n; j++)
work[j]=work[j]+allocation[i][j]; //释放该进程已分配的资源
available[j] =work[j];
}
}
}
k--;
} while(k>0);
f=1;
for (i=0; i<m; i++) { //判断有没有进程没完成
if (finish[i]=='F') {
f=0;
break;
}
}
if(f==0) {
printf("不安全状态!\m");
safety=0;
} else {
printf("处于安全状态.");
printf("安全序列号:");
for (i=0; i<m; i++)
printf ("%d ",a[i]);
printf("\m");
printf("进程");
printf(" ");
printf(" M a x ");
printf(" ");
printf("allocation");
printf(" ");
printf("need");
printf(" ");
printf("available");
printf("\m");
for (i=0; i<m; i++) {
printf("%2d",i);
printf(" ");
for(j=0; j<n; j++)
printf("%2d",max[i][j]);
printf(" ");
for(j=0; j<n; j++)
printf("%2d",allocation[i][j]);
printf(" ");
for(j=0; j<n; j++)
printf("%2d",need[i][j]);
printf(" ");
for(j=0; j<n; j++) {
if(i>0) break;
printf("%2d",available[j]);
}
for(j=0; j<n; j++) {
printf("\m");
}
}
}
}