银行家算法

来源:互联网 发布:中金佳合 知乎 编辑:程序博客网 时间:2024/04/29 17:16

#include "stdio.h"

#define M 50 //总进程数

#define N 30 //总资源数

#define FALSE 0

#define TRUE 1

int m,n;

//系统可用资源数

int AVAILABLE[N];

//M个进程已经得到N类资源的资源量

int ALLOCATION[M][N];

//M个进程还需要N类资源的资源量

int NEED[M][N];

int Request[N];

 

 main()

{

       int i=0,j=0;

       int flag=1;

       void showdata();

       void changdata(int);

       void rstordata(int);

       int chkerr(int);

       printf("输入进程总数m:");

    scanf("%d", &m);                          

    printf("输入资源种类总数n:");

    scanf("%d", &n);                                                                        

       printf("输入已分配资源数/n");

       for(i=0;i<m; i++)

              for(j=0;j<n; j++)

                     scanf("%d", &ALLOCATION[i][j]);

       printf("输入还需要的资源数/n");

              for (i=0;i<m; i++)

                     for(j=0;j<n; j++)

                     {

                     scanf("%d",&NEED [i][j]);

                     }

       printf("/n输入可利用的资源数/n");

              for (i=0;i<n; i++)

                     scanf("%d", &AVAILABLE[i]);     

       showdata();

       while(flag)

       {

              i=-1;

              while(i<0||i>=m)

              {

                     printf("请输入需申请资源的进程号(从0m-1,否则重输入!:");

                     scanf("%d",&i);

                     if(i<0||i>=m)

                     printf("输入的进程号不存在,重新输入!/n");

              }

              printf("请输入进程%d申请的资源数/n",i);

              for (j=0;j<n;j++)

                     {

                            printf("资源%d: ",j);

                            scanf("%d",&Request[j]);

                            if(Request[j]>NEED[i][j])

                            {

                                   printf("进程%d申请的资源量大于%d还需要%d类资源的资源量!",i,i,j);

                                   printf("申请不合理,出错!请重新选择/n!");

                                   flag=0;

                                   break;

                            }

                            else

                                   {

                                          if(Request[j]>AVAILABLE[j])

                                                 {

                                                        printf("进程%d申请的资源数大于系统可用%d类资源的资源量!",i,j);

                                                        printf("申请不合理,出错!请重新选择!/n");

                                                        flag=0;

                                                        break;

                                                 }

                                   }

                     }

              if(flag)

                     {

                            changdata(i);

                            if(chkerr(i))

                                   {

                                          rstordata(i);

                                   }

                     }

              else

                     showdata();

              printf("/n");

              printf("是否继续银行家算法演示,1键继续,0键退出演示: /n");

              scanf("%d",&flag);

      

       }

 return 0;}

 

 

void showdata()

{

       int i,j; 

       printf("系统可用的资源数为:/n"); 

       for (j=0;j<n;j++)

              printf("资源%d:%d ",j,AVAILABLE[j]);

       printf("/n");

printf("各进程已经得到的资源量:/n ");

       for (i=0;i<m;i++)

              {

                     printf("进程%d:",i);

                     for (j=0;j<n;j++)

                            printf("资源%d:%d ",j,ALLOCATION[i][j]);

                     printf("/n");    

              }

       printf("/n");

 

       printf("各进程还需要的资源量:/n");

            for (i=0;i<m;i++)

              {

                     printf("进程%d:",i);

                     for (j=0;j<n;j++)

                     printf("资源%d:%d ",j,NEED[i][j]);

                     printf("/n");}

                     printf("/n");

              }

  

 

void changdata(int k)

{

       int j;

       for (j=0;j<n;j++)

       {

              AVAILABLE[j]=AVAILABLE[j]-Request[j];

              ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];

              NEED[k][j]=NEED[k][j]-Request[j];

       }

 

};

 

void rstordata(int k)

{

       int j;

       for (j=0;j<n;j++)

       {

              AVAILABLE[j]=AVAILABLE[j]+Request[j];

              ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];

              NEED[k][j]=NEED[k][j]+Request[j];

       }

 

};

 

int chkerr(int s)

{

       int WORK,FINISH[M],temp[M];

       int i,j,k=0;

       for(i=0;i<m;i++)

              FINISH[i]=FALSE;//将每一个进程的finish值初始化为false

       for(j=0;j<n;j++)

       {

              WORK=AVAILABLE[j];

              i=s;

              while(i<m)

              {

                     if (FINISH[i]==FALSE&&NEED[i][j]<=WORK)

                     {

                            WORK=WORK+ALLOCATION[i][j];

                            FINISH[i]=TRUE;

                            temp[k]=i;

                            k++;

                            i=0;

                     }

                     else

                            i++;

              }

              for(i=0;i<m;i++)

                     if(FINISH[i]==FALSE)

                     {

                            printf("/n");

                            printf(" 系统不安全!!! 本次资源申请不成功!!!");

                            printf("/n");

                            return 1;

                     }

       }

       printf("/n");

       printf("经安全性检查,系统安全,本次分配成功。");

       printf("/n");

       printf("本次安全序列:");

       for(i=0;i<m;i++)

              printf("进程%d",temp[i]);

       printf("/n");

       return 0;

};

 

原创粉丝点击