📄 os.cpp
字号:
#include <stdio.h>
#include <cstring>
void main()
{
int m,n;
int i,j;
int* Avi;
Avi = new int[m];
int* Work = new int[m];
int** Max;
int** Allocation;
int** Need;
int** Request;
int Maxavi ;
int Renum;
int cycle = 1;
char Bigcycle;
int AllExcetion = 0;
int *Finish = new int[n];
printf("请输入资源总数和各资源数:\n");
printf("资源总数:");
scanf("%d",&m);
for(i = 0;i<m;i++){
char q = i+'A';
printf("资源%c:",q);
scanf("%d",&Avi[i]);
}
Maxavi = Avi[0];
fflush(stdout);
printf("请输入进程总数:");
scanf("%d",&n);
printf("各进程所需最大资源!\n");
Max = new int*[n];
for(i = 0;i<n;i++){
Max[i] = new int[m];
for(j = 0;j<m;j++){
printf("P%d",i);
char c = j + 'A';
printf("-->%c:",c);
scanf("%d",&Max[i][j]);
if(Avi[j]<Max[i][j]){
printf("没有足够大的资源供分配,请重新输入!\n");
j--;
}
}
}
printf("请输入各进程T0时刻分配的资源!\n");
Allocation = new int*[n];
for(i = 0;i<n;i++){
Allocation[i] = new int[m];
for(j = 0;j<m;j++){
printf("P%d",i);
char c = j + 'A';
printf("-->%c:",c);
scanf("%d",&Allocation[i][j]);
}
}
for(j=0;j<m;j++){
int count = 0;
for(i = 0;i<n;i++){
count += Allocation[i][j];
}
Avi[j] = Avi[j]-count;
}
//Init(Allocation,m,n);
do{
do{
printf("请输入进程号和请求资源的数目!");
Request = new int*[n];
for(i = 0;i<n;i++){
Request[i] = new int[m];
for(j = 0;j<m;j++){
Request[i][j] = 0;
}
}
printf("\n进程号:P");
scanf("%d",&Renum);
printf("\n请求资源数:");
for(j = 0;j<m;j++){
int N = Max[Renum][j]-Allocation[Renum][j];
char c = j +'A';
printf("%c:",c);
scanf(" %d",&Request[Renum][j]);
if(Request[Renum][j]>N){
printf("\nERROR!超出Need.重新输入请求资源数:");
j--;
}
else if(Request[Renum][j]>Avi[j]){
printf("尚无足够资源请等待!");
for( i = 0;i<m;i++){
Request[Renum][i] = 0;
}
cycle = 1;
break;
}
else {
cycle = 0;
printf("hello!");
}
}
}while(cycle);
printf("各进程所需资源:");
Need = new int*[n];
for(i = 0;i<n;i++)
{
Need[i] = new int[m];
printf("\nP%d:",i);
for(j = 0;j<m;j++){
Allocation[i][j] =Allocation[i][j]+Request[i][j];
Need[i][j] = Max[i][j]-Allocation[i][j];
if(Need[i][j]==0||Need[i][j]==Max[i][j]){
AllExcetion++;
printf("%2d",Need[i][j]);
}
else
printf("%2d",Need[i][j]);
}
//if(AllExcetion == m){
//printf(" 次进程已经执行完毕,处于等待中!");
//}
}
printf("\nAvailable:");
for(j=0;j<m;j++){
for(i = 0;i<n;i++)
{
if(Need[i][j]==0){
Avi[j]+=Allocation[i][j]-Request[i][j];
Allocation[i][j] = 0;
}
else Avi[j] = Avi[j]-Request[i][j];
}
printf(" %d",Avi[j]);
}
int p = 1;
int *show = new int[n];
int showNum = 0;
int Record ;
for(int f = 0;f<m;f++) //保存AVI中的内容
Work[f] = Avi[f];
for(i = 0;i<n;i++){
Finish[i] = 0;
}
while(p){
Record = Work[0];
for(i = 0;i<n;i++){
if(Finish[i]==0){
for(j = 0;j < m;j++){
if(Work[j]>=Need[i][j]){
p =1;
}
else{
p = 0;
break;
}
}
if(p==1){
for(int s = 0;s<m;s++){
Work[s] += Allocation[i][s];
}
Finish[i] = 1;
show[showNum] = i;
showNum++;
}
}
}
if(Record==Work[0]||Work[0]==Maxavi){
p = 0;
}
else{
p = 1;
}
}
if(Work[0] == Maxavi){
printf("\n安全!!!");
printf("\n安全序列是:");
for(i= 0;i<n;i++){
printf("-->P%d",show[i]);
}
printf("\n有进程发出Request请求向量吗?<Enter y or n>");
fflush(stdin);
scanf("%c",&Bigcycle);
}
else {
printf("\n这种配置不安全会死锁!!!");
Bigcycle = 'n';
}
}while(Bigcycle=='y');
scanf("%d",m);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -