?? jcss.c
字號:
#include"stdio.h"
#include"stdlib.h"
#include "string.h"
#define WAIT 1
#define READY 2
#define FINISH 3
int Available=3;/*剩余資源數量*/
int Max[3]={10,4,9};/*每個進程所需的最大資源量*/
int Allocation[3]={5,2,2};/*已分配的資源數*/
int Need[3]={5,2,7};/*還需要的資源*/
int s[3];/*記錄安全隊列*/
int state[3]={READY,READY,READY};/*每種資源的初始狀態*/
void circle(int total,int Work,int Finish[3])/*循環體*/
{
int i;
for(i=0;i<3;i++)
{
if(Finish[i]==0)
if(Need[i]<=Work)/*察看現有資源能滿足那個進程的運行,以產生安全隊列*/
{
Work=Work+Allocation[i];/*滿足某一個進程執行的要求,可以假設釋放此進程所占有的資源,以供判斷其他進程能否執行*/
Finish[i]=1;
s[total]=i;/*將安全隊列的一項存入數組*/
circle(total+1,Work,Finish);/*將現有的狀態作為參數,傳入下一個循環*/
}
}
}
int savecheck()/*此函數進行安全性測試*/
{
int i;
FILE *fp;
int flag=1;
int Work=Available;
int Finish[3]={0,0,0};/*用來標記是否能運行*/
circle(0,Work,Finish);/*由初始狀態進入循環體*/
for(i=0;i<3;i++)/*察看所有進程再次種資源分配情況下是否能安全結束*/
{
if(Finish[i]==0)
flag=0;
}
if(flag==1)/*如果都能,打印此時的系統是安全的*/
{fp=fopen("lock.txt","a+");
fprintf(fp,"The system is save.\n");
fclose(fp);
for(i=0;i<3;i++)/*打印安全隊列*/
{
if(state[i]!=FINISH)
fp=fopen("lock.txt","a+");
fprintf(fp,"p%d ",s[i]);
fclose(fp);
}
fp=fopen("lock.txt","a+");
fprintf(fp,"\n");
fclose(fp);
return 1;
}
else
{fp=fopen("lock.txt","a+");
fprintf(fp,"The system is unsave.\n");/*否則是不安全的*/
fclose(fp);
return 0;
}
}
void yhj(int n,int r)/*此函數為銀行家算法*/
{
int savety;
FILE *fp;
if(r<=Need[n])
{
if(r<=Available)
{
Available=Available-r;/*試探著從空閑資源中減去要分配的資源數*/
Allocation[n]=Allocation[n]+r;/*將資源數加到已分配資源中*/
Need[n]=Need[n]-r;/*還需資源數減去分配的資源*/
savety=savecheck();/*對這種分配方案進行安全性測試*/
if(savety==0)
{
Available=Available+r;/*savety變量為零,表明沒通過安全性測試,將分配的資源還回去*/
Allocation[n]=Allocation[n]-r;
Need[n]=Need[n]+r;
state[n]=WAIT;/*將此進程掛起*/
fp=fopen("lock.txt","a+");
fprintf(fp,"pcb%d is hanging up.\n",n);
fclose(fp);
}
else {fp=fopen("lock.txt","a+");
fprintf(fp,"Allocate %d resourse.",r);
fprintf(fp,"pcb%d is running.\n",n);/*通過安全性測試,就運行該進程,將資源真正分配出去*/
fclose(fp);
}
}
else
{ fp=fopen("lock.txt","a+");
fprintf(fp,"Resourse is not enough.The progress is waiting...\n");/*分配資源超過剩余資源*/
fclose(fp);
return;
}
}
else
{ fp=fopen("lock.txt","a+");
fprintf(fp,"Error,you apply too much resourse.\n");/*申請太多的資源*/
fclose(fp);
return;
}
}
void control()
{
int i,j,r;
FILE *fp;
for(i=0;i<3;i++)
{
if(state[i]==READY)
{
r=random(Need[i])+1;/*隨機產生一個不大于所需資源的數*/
yhj(i,r);/*執行銀行家算法,參數為進程號和要分配的資源數*/
if(Need[i]==0)/*不再需要資源*/
{
state[i]=FINISH;/*進程結束*/
Available=Available+Max[i];/*釋放所占有的資源*/
fp=fopen("lock.txt","a+");
fprintf(fp,"pcb%d has finished.\n",i);
fclose(fp);
for(j=0;j<3;j++)
if(state[j]==WAIT)/*將掛起的進程喚醒*/
state[j]=READY;
}
break;
}
}
}
main()
{
int sign=1;
int i,num=0;
FILE *fp;
while(sign)/*用sign做循環標記判斷是否繼續作循環*/
{
for(i=0;i<3;i++)/*此循環用來查看是否所有的進程都已結束*/
{if(state[i]!=FINISH)
control();/*沒有結束,就執行control()函數,控制進程的執行*/
else num++;}
if(num==3)/*如果全部結束,打印結束信息*/
{sign=0;
fp=fopen("lock.txt","a+");
fprintf(fp,"All progress are finished.\n");
fclose(fp);
}
}
getch();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -