银行家算法

来源:互联网 发布:备份与恢复软件 编辑:程序博客网 时间:2024/06/15 22:32

实验:银行家算法

实验设计说明:

1. 在程序开头声明进程名字name,进程状态finish,进程的最大需求量MAX,还需要的资源need,各类资源的总数allsourse,可利用的资源available,进程已分配的资源allocation;

2.  输入数据后先把各进程已分配的资源allocation和need输出;

3. 然后在bank函数中,先给work向量赋予available的值,接着进行判断。

4. 如果进程的初始状态为F,且进程所需的各类资源小于work,则给进程分配资源,运行完后释放资源,并将状态设为T,并将i的值设为-1(目的成功执行后又重头开始);

5. 循环执行4;

6. 最后判断进程为T的个数,如果等于进程个数,说明系统安全;否则安全;

实验代码:

#include<stdlib.h>

#include<stdio.h>

#include<malloc.h>

#define M 3

#define N 5

int R;//进程总数

int W;//资源总类数

char name[N];

char finish[N];

 int MAX[N][M];

 int need[N][M];

 intallocation[N][M];

 intallsourse[N];//各类资源的总数

 intavailable[M];//可用的资源数

void output_allocation()

{

    int i,j;

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

    {

        printf("%c",name[i]);

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

        {

       printf("%d",allocation[i][j]);

        }

       printf("\n");

    }

}

void output_need()

{

    int i,j;

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

    {

        printf("%c",name[i]);

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

        {

       printf("%d",need[i][j]);

        }

       printf("\n");

    }

}

void bank()

{

    int i=0,j=0;

    int  m=0,y=0;

    int work[M];

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

    {

       work[i]=available[i];

    }

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

    {

      if(finish[i]=='F')

        {

        if(need[i][m]<=work[m]&&need[i][m+1]<=work[m+1]&&need[i][m+2]<=work[m+2])

           {

            work[m]=work[m]+allocation[i][m];

            work[m+1]=work[m+1]+allocation[i][m+1];

            work[m+2]=work[m+2]+allocation[i][m+2];

            finish[i]='T';

            printf("name\tneed\tallocation\twork\tfinish\t\n");

            printf("%c      %d %d %d      %d %d %d       %d %d %d     %c",name[i],need[i][m],need[i][m+1],need[i][m+2],allocation[i][m],allocation[i][m+1],allocation[i][m+2],work[m],work[m+1],work[m+2],finish[i]);

            printf("\n");

             i=-1;//重头开始判断

           }

 

         }

    }

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

    {

       if(finish[i]=='T')

             y++;

    }

    if(y==N)

    {

      printf("系统是安全的");

    }

    else

       {

      printf("系统不安全 ");

       }

}

int main()

{

    intR,W,i,j,p;

   printf("进程总数为:");

   scanf("%d",&R);

   printf("资源总类数为:");

   scanf("%d",&W);

   printf("各进程名为:\n");

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

    {

      scanf("%s",&name[i]);

    }

   printf("各进程初始状态:\n");

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

    {

       scanf("%s",&finish[i]);

    }

   printf("各资源总数为:\n");

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

    {

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

    }

   printf("各进程的最大需求量:\n");

   printf("注意最大需求量要小于各进程总数:");

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

    {

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

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

    }

   printf("已分配的资源总数:\n");

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

    {

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

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

 

    }

   output_allocation();

   printf("还需要的资源数:\n");

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

    {

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

        {

          need[i][j]=MAX[i][j]-allocation[i][j];

        }

    }

   output_need();

   printf("各类可利用的资源数:");

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

    {

       p=allsourse[i];

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

         p=p-allocation[j][i];

       available[i]=p;

    }

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

    {

       printf("%d",available[i]);

    }

   printf("\n");

    bank();

}


1 0