本文目錄一覽:
銀行家算法的C語言程序
1.根據下面給出的系統中資源分配情況,以及各個進程的資源申請情況,通過銀行家算法來判斷各進程的資源請求能否滿足(要求記錄程序的運行過程)。 已分配的
改程序——銀行家算法C語言版
你是學軟件的學生嗎 ?
我是學軟件的,我在操作系統里學了銀行家算法,等我看了,在告訴你我的看法,好嗎?
願意的話希望交流一下 我的郵箱qingdaheqiang@163.com
高分求銀行家算法c語言版
#include “malloc.h”
#include “stdio.h”
#include “stdlib.h”
#define alloclen sizeof(struct allocation)
#define maxlen sizeof(struct max)
#define avalen sizeof(struct available)
#define needlen sizeof(struct need)
#define finilen sizeof(struct finish)
#define pathlen sizeof(struct path)
struct allocation
{
int value;
struct allocation *next;
};
struct max
{
int value;
struct max *next;
};
struct available /*可用資源數*/
{
int value;
struct available *next;
};
struct need /*需求資源數*/
{
int value;
struct need *next;
};
struct path
{
int value;
struct path *next;
};
struct finish
{
int stat;
struct finish *next;
};
int main()
{
int row,colum,status=0,i,j,t,temp,processtest;
struct allocation *allochead,*alloc1,*alloc2,*alloctemp;
struct max *maxhead,*maxium1,*maxium2,*maxtemp;
struct available *avahead,*available1,*available2,*workhead,*work1,*work2,*worktemp,*worktemp1;
struct need *needhead,*need1,*need2,*needtemp;
struct finish *finihead,*finish1,*finish2,*finishtemp;
struct path *pathhead,*path1,*path2;
printf(“\n請輸入系統資源的種類數:”);
scanf(“%d”,colum);
printf(“請輸入現時內存中的進程數:”);
scanf(“%d”,row);
printf(“請輸入已分配資源矩陣:\n”);
for(i=0;irow;i++)
{
for (j=0;jcolum;j++)
{
printf(“請輸入已分配給進程 p%d 的 %c 種系統資源:”,i,’A’+j);
if(status==0)
{
allochead=alloc1=alloc2=(struct allocation*)malloc(alloclen);
alloc1-next=alloc2-next=NULL;
scanf(“%d”,allochead-value);
status++;
}
else
{
alloc2=(struct allocation *)malloc(alloclen);
scanf(“%d,%d”,alloc2-value);
if(status==1)
{
allochead-next=alloc2;
status++;
}
alloc1-next=alloc2;
alloc1=alloc2;
}
}
}
alloc2-next=NULL;
status=0;
printf(“請輸入最大需求矩陣:\n”);
for(i=0;irow;i++)
{
for (j=0;jcolum;j++)
{
printf(“請輸入進程 p%d 種類 %c 系統資源最大需求:”,i,’A’+j);
if(status==0)
{
maxhead=maxium1=maxium2=(struct max*)malloc(maxlen);
maxium1-next=maxium2-next=NULL;
scanf(“%d”,maxium1-value);
status++;
}
else
{
maxium2=(struct max *)malloc(maxlen);
scanf(“%d,%d”,maxium2-value);
if(status==1)
{
maxhead-next=maxium2;
status++;
}
maxium1-next=maxium2;
maxium1=maxium2;
}
}
}
maxium2-next=NULL;
status=0;
printf(“請輸入現時系統剩餘的資源矩陣:\n”);
for (j=0;jcolum;j++)
{
printf(“種類 %c 的系統資源剩餘:”,’A’+j);
if(status==0)
{
avahead=available1=available2=(struct available*)malloc(avalen);
workhead=work1=work2=(struct available*)malloc(avalen);
available1-next=available2-next=NULL;
work1-next=work2-next=NULL;
scanf(“%d”,available1-value);
work1-value=available1-value;
status++;
}
else
{
available2=(struct available*)malloc(avalen);
work2=(struct available*)malloc(avalen);
scanf(“%d,%d”,available2-value);
work2-value=available2-value;
if(status==1)
{
avahead-next=available2;
workhead-next=work2;
status++;
}
available1-next=available2;
available1=available2;
work1-next=work2;
work1=work2;
}
}
available2-next=NULL;
work2-next=NULL;
status=0;
alloctemp=allochead;
maxtemp=maxhead;
for(i=0;irow;i++)
for (j=0;jcolum;j++)
{
if(status==0)
{
needhead=need1=need2=(struct need*)malloc(needlen);
need1-next=need2-next=NULL;
need1-value=maxtemp-value-alloctemp-value;
status++;
}
else
{
need2=(struct need *)malloc(needlen);
need2-value=(maxtemp-value)-(alloctemp-value);
if(status==1)
{
needhead-next=need2;
status++;
}
need1-next=need2;
need1=need2;
}
maxtemp=maxtemp-next;
alloctemp=alloctemp-next;
}
need2-next=NULL;
status=0;
for(i=0;irow;i++)
{
if(status==0)
{
finihead=finish1=finish2=(struct finish*)malloc(finilen);
finish1-next=finish2-next=NULL;
finish1-stat=0;
status++;
}
else
{
finish2=(struct finish*)malloc(finilen);
finish2-stat=0;
if(status==1)
{
finihead-next=finish2;
status++;
}
finish1-next=finish2;
finish1=finish2;
}
}
finish2-next=NULL; /*Initialization compleated*/
status=0;
processtest=0;
for(temp=0;temprow;temp++)
{
alloctemp=allochead;
needtemp=needhead;
finishtemp=finihead;
worktemp=workhead;
for(i=0;irow;i++)
{
worktemp1=worktemp;
if(finishtemp-stat==0)
{
for(j=0;jcolum;j++,needtemp=needtemp-next,worktemp=worktemp-next)
if(needtemp-value=worktemp-value)
processtest++;
if(processtest==colum)
{
for(j=0;jcolum;j++)
{
worktemp1-value+=alloctemp-value;
worktemp1=worktemp1-next;
alloctemp=alloctemp-next;
}
if(status==0)
{
pathhead=path1=path2=(struct path*)malloc(pathlen);
path1-next=path2-next=NULL;
path1-value=i;
status++;
}
else
{
path2=(struct path*)malloc(pathlen);
path2-value=i;
if(status==1)
{
pathhead-next=path2;
status++;
}
path1-next=path2;
path1=path2;
}
finishtemp-stat=1;
}
else
{
for(t=0;tcolum;t++)
alloctemp=alloctemp-next;
finishtemp-stat=0;
}
}
else
for(t=0;tcolum;t++)
{
needtemp=needtemp-next;
alloctemp=alloctemp-next;
}
processtest=0;
worktemp=workhead;
finishtemp=finishtemp-next;
}
}
path2-next=NULL;
finishtemp=finihead;
for(temp=0;temprow;temp++)
{
if(finishtemp-stat==0)
{
printf(“\n系統處於非安全狀態!\n”);
exit(0);
}
finishtemp=finishtemp-next;
}
printf(“\n系統處於安全狀態.\n”);
printf(“\n安全序列為: \n”);
do
{
printf(“p%d “,pathhead-value);
}
while(pathhead=pathhead-next);
printf(“\n”);
return 0;
}
操作系統(死鎖避免)—-銀行家算法解題
死鎖:是指兩個以上的進程都因要求對方已經佔有的資源,導致無法運行下去的現象,死鎖是系統的一種出錯狀態,不僅浪費大量的系統資源,甚至會導致整個系統的崩潰,所以死鎖是盡量預防和避免的。
產生死鎖的四個條件:
死鎖的處理
銀行家算法是死鎖避免的重要算法。
銀行家算法:資源==錢;收回資源==收回貸款;收不回資源==不會放貸;
例題:假設系統中有三類互斥資源R1,R2,R3。可用資源分別是9,8,5.在T0時刻系統有P1,P2,P3,P4,P5五個進程,這些進程最大的需求和已分配的資源如下所示,如果按_執行,那麼系統的狀態是安全的。
解:第一步:根據可用資源,可以求得剩餘資源。
R1=9-(1+2+2+1+1)=2
R2=8-(2+1+1+2+1)=1
R3=5-(1+1+0+0+3)=0
第二步:根據剩餘資源求得還需要的資源數。
公式:還需資源(Need)=最大需求(Max)-已分配資源(Allocation)。
第三部,根據剩餘資源數,求出安全序列。
根據剩餘資源可得,p2可以執行(條件:每個值都必須≦剩餘資源)
由此可見安全序列為P2–p4–p5–p1–p3。
其實安全序列不是唯一的,這是為什麼呢?
大家可以看出來,現有資源要大於需要資源的情況下是有多種選擇的,因此安全序列不唯一。
c語言銀行家算法安全性判別
把1作為參數傳給yanzheng() yanzheng(int m)
然後驗證函數里修改:
work=Avaliable;
i=m;
while(im)
{
if (Finish[i]==falseNeed[i]=work)
{
work=work+Allocation[i];
Finish[i]=true;
anquan[k]=i;
k++;
i = 0;
}
else
i++;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/251704.html