⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7.c

📁 c.rar___z8786052200751110333362469.rar
💻 C
字号:
本程序模拟的是《计算机操作系统》(汤子赢等)课本P97"银行家算法之例"编写的


第一部分:银行家算法(扫描)
1.如果Request<=Need,则转向2;否则,出错
2.如果Request<=Available,则转向3,否则等待
3.系统试探分配请求的资源给进程
4.系统执行安全性算法
第二部分:安全性算法
1.设置两个向量
(1).工作向量:Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)
(2).Finish:表示系统是否有足够资源分配给进程(True:有;False:没有).初始化为False
2.若Finish[i]=False&&Need<=Work,则执行3;否则执行4(I为资源类别)
3.进程P获得第i类资源,则顺利执行直至完成!并释放资源:
Work=Work+Allocation;
Finish[i]=true;
转2
4.  若所有进程的Finish[i]=true,则表示系统安全;否则,不安全!

程序说明:

一、开发语言:C语言
二、本程序模拟的是课本P97"银行家算法之例"编写的。
    即系统中有五个进程{0,1,2,3,4}和三类资源{A,B,C},各进程的初始资源分配情况及各资源的总数量均     参照该例子。
三、本程序中共四个函数分别为:zhibiao(),apply(),test(),及主函数main()
    其中:
    1、zhibiao()的功能为:直观的列出系统某时刻的资源分配情况。
    2、apply()的功能为:进程发出资源请求后,系统试探着把资源分配给该进程并修改数据结构中的数值。
    3、test()的功能为:系统的安全性检测。
四、需要注意的问题:
    1、本程序的前提是假设当前只有一个进程请求资源。
    2、一旦操作不符合要求会得到意想不到的结果!再按任意键可能该程序也不能正常运行,则就关闭该程序,       然后再打开重新运行便可.
五、课本上的例子在这个程序中运行后成功。
    例如:P1:Request1(1,0,2)
          p4: Request4(3,3,0)
          P0:Request0(0,2,0)
    再测试P0:Request0(0,1,0) 同课本上的结果相同。
本程序还有很多不足,功能不很完善,只是适合于当前只有一个进程请求资源,且进程和资源都是事先固定好的.

源代码:
#include "dos.h"
#include "conio.h"
#include "alloc.h"

int available[3]={3,3,2};
int max[6][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int allocation[6][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
int need[6][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
int live[5]={1,1,1,1,1};
int stay[3][3];
int request[3],process[5];
int i,j,p=5,pro,x,k1;
void zhibiao()
{ x=1;
  printf("      Max         All         Nee         Ava\n");
  printf("PRO   A  B  C     A  B  C     A  B  C     A  B  C\n");
  for(i=0;i<p;i++)
  {  if(live[i]==1)
   { printf("P%d    ",i);
     for(j=0;j<=2;j++)
     {printf("%-3d",max[i][j]);}printf("   ");
     for(j=0;j<=2;j++)
     {printf("%-3d",allocation[i][j]);}printf("   ");
     for(j=0;j<=2;j++)
     {printf("%-3d",need[i][j]);}printf("   ");
    }
     if(x==1&&live[i]==1) {printf("%-3d%-3d%-3d",available[0],available[1],available[2]);x=0;}
     if(live[i]==1) printf("\n"); 
  }
}
int apply()
{ int v=1;
  for(i=0;i<=2;i++)
  {if(need[pro][i]<request[i])  {v=0;break;}
   if(available[i]<request[i])  {v=0;break;}}
  if(v==1){for(i=0;i<=2;i++)
           {stay[0][i]=allocation[pro][i];allocation[pro][i]+=request[i];
            stay[1][i]=need[pro][i];need[pro][i]-=request[i];
            stay[2][i]=available[i];available[i]-=request[i];}
           }
  return(v);
}
int test()
{ int work[3],finish[5]={0,0,0,0,0},v,k=0,t=0;
  for(i=0;i<p;i++)
  if(live[i]==0) {finish[i]=1;k1--;}
  for(i=0;i<=2;i++)  work[i]=available[i];
 while(1)
 { for(i=0;i<=4;i++)
   { if(finish[i]==0) { v=1;
                        for(j=0;j<=2;j++)
                         if(need[i][j]>work[j])  {v=0;break;}
                        if(v==1) { finish[i]=1;
                                   for(j=0;j<=2;j++)  work[j]+=allocation[i][j];
                                   process[k]=i;k++;
                                  }
                       }
}
    if(t==k)  break;
       else   t=k;
    if(k==k1)  break;
  }
if(k==k1)  return(1);
else      return(0);

}
main()
{
 while(1)
{zhibiao();
 k1=5;
 printf("该系统中共五个进程{0,1,2,3,4},请输入其中一个进程:P");
 scanf("%d",&pro);
 if(pro<0||pro>4)  break;
 printf("P%d请求的三类资源数(资源数用逗号隔开)分别是:",pro);
 scanf("%d,%d,%d",&request[0],&request[1],&request[2]);
 if(apply()==0)  {printf("出错或尚无足够资源,P%d必须等待!\n",pro);
                  printf("请按任意键继续。");}
 else   if(test()==0) {printf("系统处于不安全状态,P%d必须等待!\n",pro);
                       for(i=0;i<=2;i++)
                       { allocation[pro][i]=stay[0][i];
                         need[pro][i]=stay[1][i];
                         available[i]=stay[2][i];}
        printf("请按任意键继续。");} 
 else   {zhibiao();printf("系统处于安全状态!\n");
         printf("存在一安全序列为:");
         for(i=0;i<k1-1;i++)
         printf("P%d>",process[i]);
         printf("P%d",process[k1-1]);
         printf("\n请按任意键继续。");}
 if(need[pro][0]==0&&need[pro][1]==0&&need[pro][2]==0)
    for(i=0;i<=2;i++)
 {available[i]+=max[pro][i];
     live[pro]=0;}
 getch();
 clrscr();
 delay(5000);
}
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -