?? 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 + -