网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > 课程设计 > 正文

银行家算法C语言实现

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务
银行家算法C语言实现
编程模拟实现生产者---消费者问题
一、实验目的与实验项目介绍
银行家算法是最有代表性的避免死锁的算法,由于该算法能用于银行系统现金贷款的发放而得名。其实现思想是:允许进程动态地申请资源,系统在每次实施资源分配之前,先计算资源分配的安全性,若此次资源分配安全(即资源分配后,系统能按某种顺序来为每个进程分配其所需的资源,直至最大需求,使每个进程都可以顺利地完成),便将资源分配给进程,否则不分配资源,让进程等待。
实验的目的
 1.加深对死锁概念的理解
2. 能够利用银行家算法,有效避免死锁的发生,或检测死锁的存在。二、实验项目方案设计  1.定义银行家算法中的数据结构available[],allocation[][],need[][]等
利用定义的全局变量来进行函数间值的传递
2.此实验通过3个函数实现,a:主函数(main),b:安全检测函数(check),c:输出函数(print).
3.主函数(main)的实现:输入已知条件,利用安全检测函数检测已知的进程分配情况是否为安全状况。如果为安全,则输入需请求资源的进程号和所需资源数,否则结束主函数。reqi为进程i的请求向量。进行银行家算法:(1):如果reqi[j]>need[i][j]则认为出错,输出请求的资源数超过它所需的最大数; 否则执行(2); (2):如果reqi[j]>available[i][j]则输出尚无足够的资源;否则执行(3)。
(3):系统试探着把资源分配给进程i,并修改下面数据结构中的数值:available[j]:=available[j]-reqi[j];allocation[i][j]:=allocation[i][j]+reqi[j];
need[i][j]:=need[i][j]-reqi[j];并且保存修改前的数值。(4):系统执行安全性算法。如果不安全则还原(3)中保存的available[j],allocation[i][j], need[i][j]的值.最后输入是否要继续,如继续则转至前面的输入请求资源的进程号,否则退出。
4.安全检测函数(check): (1)设置两个向量work和finish : work:=available,表示系统可提供给进程继续运行所需的各类资源数目;finish表示系统是否有足够的资源分配给进程,使之完成。开始时先做finish[i]:=false;当有足够资源分配给进程时,再令finish[i]:=true。(2)从进程集合中找到一个能满足下述条件的进程:
a:  finish[i]=false; b: need[i][j]<=work[j]; 若找到,执行(3),否则,执行(4)。
(3):当进程i获得资源后,可顺利执行,直到完成,并释放出分配给它的资源,故应执行:
work[j]:=work[j]+allocation[i,j];
finish[i]:=true;
a[v++]=i;    ( 记录安全序列)
go to step 2;
(4):如果所有进程的finish[i]=true都满足,则表示系统处于安全状态,输出安全序列;否则,系统处于不安全状态。
5.输出函数(print): 利用循环体输出各进程号,已分配的资源数数,仍需要的资源数,剩余的可用资源数。
三、实验实施步骤   1.在TC上新建一个文件,并保存为bank1,在编辑界面中输入以下代码:
#define M 50
int allocation[M][M],need[M][M],available[M];   //定义全局变量
 int n, m, r;
main()
{void check();
 void print();
 int i, j, p=0,q=0;
 int req[M], allocation1[M][M],need1[M][M],available1[M];
 printf("Please input the sum of processes:");
 scanf("%d", &n);                           //输入进程总数
 printf("Please input the sum of kinds:");
 scanf("%d", &m);                          //输入资源种类总数
 printf("Please input the known condition:\n");
 printf(" Allocation\n");
 for(i=0;i for(j=0;j  scanf("%d", &allocation[i][j]);              //输入已知的进程已分配资源数
printf( "Need\n");
 for (i=0;ifor(j=0;j  scanf("%d", &need[i][j]);                  //输入已知的进程还需要的资源数
printf("Available\n");
 for (i=0;i scanf("%d", &available[i]);                //输入已知的可用资源数
 print();                                  //输出各已知条件
 check();                                 //检测已知的状态是否安全
 if (r==1)                             //如果已知的状态安全则执行以下代码
   {do {
        printf("\nplease input the NO. of process: ");
        scanf("%d", &i);                //输入请求资源的进程号
        printf("please input the resources of request, A B C:");
        for(j=0;j        scanf("%d",&req[j]);            //输入该进程所需的资源数
        p=0;
        q=0;
       for(j=0;j       if(req[j]>need[i][j]) p=1;         //判断请求是否超过它所宣布的最大资源数
       if(p)  printf("The resources of request have been beyond the max number needed!");
       else {
             for(j=0;j             if(req[j]>available[j]) q=1;  //判断请求是否超过可用资源数
             if(q)  printf("There are not enough available resources!");
             else {for(j=0;j
 
银行家算法C语言实现
   { available1[j]=available[j];       /* 保存原已分配的资源数,
                      allocation1[i][j]=allocation[i][j]; 仍需要的资源数,和可用的
                           need1[i][j]=need[i][j];        资源数*/
                           available[j]=available[j]-req[j];  / * 系统尝试把资源分配
                      allocation[i][j]=allocation[i][j]+req[j];   给请求的进程 */
                      need[i][j]=need[i][j]-req[j];
                     }
                     print();
                     check();                         //进行安全检测
                    if (r==0)                          //分配后状态不安全
                      {for (j=0;j                          {available[j]=available1[j];   /* 还原分配前的已分配的资
                           allocation[i][j]=allocation1[i][j];  源数,仍需要的资源数
                           need[i][j]=need1[i][j];            和可用的资源数 */
                           }
                         printf("return:\n");
                         print();
                      }
                  }
              }
     printf("\nDo you want to continue? y or n?\n");  //判断是否继续进行资源分配
     } while (getch()=='y');
   }
}
void check()                          //检测函数
{int k, f, v=0,i,j;
 int work[M],a[M],finish[M];
 r=1;
 for(i=0;i    finish[i]=0;       //初始化各进程均没得到足够资源并完成
for(i=0;i    work[i]=available[i];   //用work[i]表示可提供进程继续运行的各类资源数
 k=n;
 do{
    for (i=0;i       {if (finish[i]==0)
         {f=1;
          for (j=0;j                if (need[i][j]>work[j])
                 f=0;
               if (f==1)    /*找到还没完成的且需求数小于可提供进程继续运行的
                   {finish[i]=1;      资源数的进程*/
                    a[v++]=i;      //记录安全序列
                    for (j=0;j                        work[j]=work[j]+allocation[i][j]; //释放该进程已分配的资源
                   }
          }
        }
      k--;
   }while(k>0);
 f=1;
 for (i=0;i    {
       if (finish[i]==0)
        {
         f=0;
         break;
        }
      }
 if (f==0)          //若有进程没完成,则为不安全状态
     {
      printf("This is unsafe  \n");
     r=0;
    }
 else                      // 否则为安全状态
     {
      printf("This is safe and the safe number is:");
      for (i=0;i      printf ("%d ",a[i]);         //输出安全序列
    }
}
void print()                    //输出函数
 { int i, j;
   int process[M];
  printf("Process\t Allocation\t  Need\n");
若图片无法显示请联系QQ3710167,银行家算法C语言实现系统免费,转发请注明源于www.lwfree.cn

       printf("%2d ",need[i][j]);
       printf("\n");
    }
  printf("Available\n");
  for(i=0;i  printf("%2d ",available[i]);
  printf("\n");
 }
运行以上程序代码,其中一种输出结果如下:
 

银行家算法C语言实现
四、实验小结与心得
1.银行家算法的关键在于安全性算法。n遍检测所有进程后,如系统处于安全状态,一定能使n个进程都完成。
2.要注意当系统试探着把资源分配给进程后,如此时检测到系统处于不安全状态,则此时系统不把资源分配给该进程,请联系QQ3710167这时要还原尝试分配时所改变的各数据结构中的数值。银行家算法C语言实现主流程图
3. 刚开始做这个课程设计时不知道从哪里入手,后来到图书馆和网上查了些资料,觉得并不难,但是真正做起来才发现很多细节问题都忘了考虑。银行家算法中可能出现的 情况比较多,所以需要考虑的方面也比较多。经过了反复的思考和多次的修改才得出了以上的结果。通过这次的课程设计,对银行家算法有了更深的认识,并能掌握其设计思想。这两个程序都可以,bank是事先确定好已知的allocation,need ,available,输入简单bank1怎没固定已知条件中的allocation,need,available,须手动输入,但适用更广
 
银行家算法C语言实现
#define M 50int allocation[M][M],need[M][M],available[M]; int n,m,r;main(){void check(); void print(); int i,j,p=0,q=0; int req[M], allocation1[M][M],need1[M][M],available1[M]; printf("Please input the sum of processes:"); scanf("%d",&n); for(j=0;j printf("Available\n"); for (i=0;ineed[i][j]) p=1;       if(p)  printf("The resources of request have been beyond the max number needed!");        else {             for(j=0;javailable[j]) q=1;             if(q)  printf("There are not enough available resources!");             else {for(j=0;jwork[j])             f=0;               if (f==1)               {finish[i]=1;                a[v++]=i;                for (j=0;j0); f=1; for (i=0;i
 
银行家算法C语言实现
#include#define m 3  #define n 5  struct REQUEST{ int x; int requ[m];}req;int allocation1[n][m],need1[n][m],available1[m];int r,t;void check(int allocation[][m],int available[m],int need[][m]);void print(int allocation[][m],int available[m],int need[][m]);main(){ int i,j,p=0,q=0; int allocation[n][m]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; int need[n][m]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}}; int available[m]={3,3,2}; print(allocation,available,need); check(allocation,available,need);if (t==1){do { printf("\nplease input the NO. of process: "); scanf("%d",&req.x); r=req.x; printf("please input the resouces of request A B C:"); for(j=0;jneed[r][j]) p=1; if(p)  printf("\nThe resouces of request have been beyond the max number needed!");    else {    for(j=0;javailable[j]) q=1;    if(q)  printf("\nThere are not enough available resouces!");    else {for(j=0;j   }    } printf("\nDo you want to continue? y or n?\n");}while (getch()=='y');}}void check(int allocation[][m],int available[m],int need[][m]){int k,f=1,v=0,i,j ; int a[n]; int finish[n]={0,0,0,0,0}; int work[m]; t=1; for(i=0;iwork[j]) f=0;       if(f==1) {finish[i]=1; a[v++]=i; for (j=0;j0); f=1; for (i=0;i
  • 上一篇资讯: JSP+mysql电子购物商城
  • 下一篇资讯: 凯撒密码VB方法
  • 版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师