数据定义:

  • E:Existing Resource 示意以后资源总量
  • A:Available Resource 示意以后可分配资源
  • MaxR:示意每种资源须要的最大需求量
  • C:Current Resource 示意以后已调配的资源
  • R:每种资源的最大可能申请
  • N:以后过程申请的资源

数据间的关系:

$$R = maxR – C$$
$$\sum{C}+ A = E$$

采纳的数据结构:

假如资源品种有RNum种,过程数量共有PNum个

则E、A、N均为大小为RNum的向量,含意为:
E[i]:示意第i种资源的资源总量
A[i]:示意第i种资源的以后残余资源,即为以后可分配资源
N[i]:示意以后提出申请的过程,对第i种资源的申请量

因而,以上三种数据的数据结构均用一维数组示意即可

maxR、C、R为二维矩阵,矩阵的行示意过程的各种资源量,矩阵的列代表不同过程,如下表:

maxRCR
P1(70,40,60)(20,20,20)(50,20,40)
P2(40,40,50)(10,10,10)(30,30,40)
P3(50,30,60)(30,30,30)(20,0,30)

各数据的定义如下:

int E[MAX_RNUM],A[MAX_RNUM],PNum,RNum;int maxR[MAX_PNUM][MAX_RNUM],       C[MAX_PNUM][MAX_RNUM],       R[MAX_PNUM][MAX_RNUM];

设计思路:

要在过程调配时防止死锁,采纳如下实现思路:
在每次过程分配资源之前,对以后零碎进行死锁检测,判断零碎是否有可能产生死锁,若可能,则回绝此次资源分配。

要进行死锁检测,采纳银行家算法:
银行家算法的根本思维是分配资源之前,判断零碎是否是平安的;若是,才调配。它是最具备代表性的防止死锁的算法。
根据上述的数据结构,进行如下操作:
设过程Pi提出申请N[i],则银行家算法按如下规定进行判断。
(1)如果N[i] [j]<= Ri,则转(2);否则,出错。
(2)如果N[i] [j]<= A[j],则转(3);否则,期待。
(3)零碎试探分配资源,批改相干数据:
A[j]-=Ni;
Ci+=Ni;
Ri-=Ni;
(4)零碎执行安全性查看,如平安,则调配成立;否则试探险性调配作废,零碎恢复原状,过程期待。

咱们采纳一个标记数组finished[PNum]来标记过程P[i]是否通过上述试探性调配
如果所有过程全副都通过试探性调配,即所有过程都被标记,阐明系统安全,并可依据资源分配的程序,输入此时零碎的安全性序列Order。否则,未被标记的过程(即Finished[i] = false)是可能产生死锁的过程。

因而,只有所有过程都被标记,FinishedNum == PNum时,死锁检测算法能力返回true,否则返回false。

int Safe(FILE * fp){    int FinishedNum = 0,i,Finished[MAX_PNUM] = {0};    int testA[MAX_RNUM];    for(int i = 1;i <= RNum;i++){        testA[i] = A[i];    }    int Order[MAX_PNUM] = {0},k = 0;        while(FinishedNum != PNum){                for(i = 1;i <= PNum;i++){            if(Finished[i] == 0 && find(R[i], testA)){                for(int j = 1;j <= RNum;j++){                    testA[j] += C[i][j];                }                Finished[i] = 1;                Order[k++] = i;//记录                FinishedNum++;                if(FinishedNum == PNum){                    //输入Order到文件                    fprintf(fp,"Process Safe Order:");                    for(i = 0;i < PNum;i++){                        fprintf(fp,"%d ",Order[i]);                    }                    fprintf(fp,"\n");                    break;                }                break;            }        }        if(i > PNum){            return -1;        }            }    return 1;}

若死锁检测为真,则依据以后过程P[i]提出的资源申请N[RNum]进行资源分配,更新数据结构。
代码如下:

void ProcessAsk(int k,int *N,FILE * fp){//过程P_k想要申请N个资源    if(Safe(fp) == 1){        printf("SYSTEM SAFE! Resource Allocating...\n");        if(in_Scale(A,N) && in_Scale(R[k],N)){//A-N>=0 && R[k] - N >= 0            for(int j = 1;j <= RNum;j++){                C[k][j] += N[j];            }            for(int j = 1;j <= RNum;j++){                R[k][j] -= N[j];            }            if(isZero(R[k])){                for(int j = 1;j <= RNum;j++){                    A[j] += maxR[k][j];                }                printf("Process%d have released Resource!\n",k);            }            for(int j = 1;j <= RNum;j++){                A[j] -= N[j];            }            fprintf(fp,"Allocate P%d SUCCESS!\n",k);            printf("Allocate P%d SUCCESS!\n",k);            showInfo();//            write2File(fp);        }else{            printf("FAILED!Resource OverScale!\n");        }    }else{        printf("SYSTEM WARNING! ");        showInfo();        fprintf(fp,"Allocate P%d FAILED!\n",k);    }}

残缺代码

#include <stdio.h>#include <stdlib.h>#define MAX_PNUM 501#define MAX_RNUM 100int E[MAX_RNUM],A[MAX_RNUM],PNum,RNum;int maxR[MAX_PNUM][MAX_RNUM],C[MAX_PNUM][MAX_RNUM],R[MAX_PNUM][MAX_RNUM];void Init(){    int i;        printf("Input the Resource Num:");    scanf("%d",&RNum);        printf("Input the Existing Resource:");    for(int i = 1;i <= RNum;i++){        scanf("%d",&E[i]);    }        for(int i = 1;i <= RNum;i++){        A[i] = E[i];    }        printf("Input the Num of Process:");    scanf("%d",&PNum);        printf("Input the MAX_Need Resource of every Process:");    for(i = 1;i <= PNum;i++){        for(int j = 1;j <= RNum;j++){            scanf("%d",&maxR[i][j]);            C[i][j] = 0;            R[i][j] = maxR[i][j];        }    }}int find(int * Ri,int * A){    for(int i = 1;i <= RNum;i++){        if(Ri[i] > A[i]) return 0;    }    return 1;}int Safe(FILE * fp){    int FinishedNum = 0,i,Finished[MAX_PNUM] = {0};    int testA[MAX_RNUM];    for(int i = 1;i <= RNum;i++){        testA[i] = A[i];    }    int Order[MAX_PNUM] = {0},k = 0;        while(FinishedNum != PNum){                for(i = 1;i <= PNum;i++){            if(Finished[i] == 0 && find(R[i], testA)){                for(int j = 1;j <= RNum;j++){                    testA[j] += C[i][j];                }                Finished[i] = 1;                Order[k++] = i;//记录                FinishedNum++;                if(FinishedNum == PNum){                    //输入Order到文件                    fprintf(fp,"Process Safe Order:");                    for(i = 0;i < PNum;i++){                        fprintf(fp,"%d ",Order[i]);                    }                    fprintf(fp,"\n");                    break;                }                break;            }        }        if(i > PNum){            return -1;        }            }    return 1;}void printVector(int * vector,int n){    printf("(");    for(int i = 1;i <= n;i++){        printf("%d ",vector[i]);    }    printf(")");}void showInfo(){    int i;    printf("*********************************************\n");    printf("Existing Resource:");    printVector(E, RNum);    printf(",Available Resource:");    printVector(A, RNum);    printf("\n");        printf("maxR:\n");    for(int i = 1;i <= PNum;i++){        for(int j = 1;j <= RNum;j++){            printf("%d ",maxR[i][j]);        }        printf("\n");    }        printf("CurrentR\n");    for(int i = 1;i <= PNum;i++){        for(int j = 1;j <= RNum;j++){            printf("%d ",C[i][j]);        }        printf("\n");    }        printf("Request:\n");    for(int i = 1;i <= PNum;i++){        for(int j = 1;j <= RNum;j++){            printf("%d ",R[i][j]);        }        printf("\n");    }        printf("*********************************************\n");}//void write2File(FILE * fp){//    int i;//    fprintf(fp, "*********************************************\n");//    fprintf(fp, "Existing Resource:%d, Available Resource:%d\n",E,A);//    fprintf(fp,"maxR\tCurrentR\tRequest\n");//    for(i = 1;i <= PNum;i++){//        fprintf(fp,"%d\t\t%d\t\t\t%d\n",maxR[i],C[i],R[i]);//    }//    fprintf(fp,"*********************************************\n");//    //}int in_Scale(int * vector,int * N){    for(int j = 1;j <= RNum;j++){        if(vector[j] < N[j]) return 0;     }    return 1;}int isZero(int *Rk){    for(int j = 1;j <= RNum;j++){        if(Rk[j] != 0) return 0;    }    return 1;}void ProcessAsk(int k,int *N,FILE * fp){//过程P_k想要申请N个资源    if(Safe(fp) == 1){        printf("SYSTEM SAFE! Resource Allocating...\n");        if(in_Scale(A,N) && in_Scale(R[k],N)){//A-N>=0 && R[k] - N >= 0            for(int j = 1;j <= RNum;j++){                C[k][j] += N[j];            }            for(int j = 1;j <= RNum;j++){                R[k][j] -= N[j];            }            if(isZero(R[k])){                for(int j = 1;j <= RNum;j++){                    A[j] += maxR[k][j];                }                printf("Process%d have released Resource!\n",k);            }            for(int j = 1;j <= RNum;j++){                A[j] -= N[j];            }            fprintf(fp,"Allocate P%d SUCCESS!\n",k);            printf("Allocate P%d SUCCESS!\n",k);            showInfo();//            write2File(fp);        }else{            printf("FAILED!Resource OverScale!\n");        }    }else{        printf("SYSTEM WARNING! ");        showInfo();        fprintf(fp,"Allocate P%d FAILED!\n",k);    }}int main(int argc, char *argv[]) {    Init();    FILE * fp;    int i;    if((fp=fopen("test.txt", "w+")) == NULL){        fprintf(stdout, "Can't open \"test\" file.\n ");        exit(EXIT_FAILURE);    }    showInfo();//    write2File(fp);    while(1){        int k,N[RNum];        printf("\nInput the ProcessNum and the Ask for Resource:");        scanf("%d",&k);        printf("Input the ask for Resource:");        for(int i = 1;i <= RNum;i++){            scanf("%d",&N[i]);        }                if(k <= 0 || k > PNum){            printf("Process NOT exist!\n");            break;        }else{//            fprintf(fp, "\nProcess%d asking for %d Resource\n",k,N);        }        ProcessAsk(k, N, fp);    }            return 0;}