银行家算法的模拟

源程序清单如下:

#include "string.h"
#include "iostream"
using namespace std;
#define FALSE 0
#define TRUE 1
#define W 10
#define R 20
int M ; //总进程数
int N ; //资源种类
int ALL_RESOURCE[W];//各种资源的数目总和
int MAX[W][R]; //M个进程对N类资源最大资源需求量
int AVAILABLE[R]; //系统可用资源数
int ALLOCATION[W][R]; //M个进程已经得到N类资源的资源量
int NEED[W][R]; //M个进程还需要N类资源的资源量
int Request[R]; //请求资源个数
void showdata() //函数showdata,输出资源分配情况
{
   int i,j;
   cout<<"各种资源的总数量(all):"<<endl;
   cout<<" ";
   for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<ALL_RESOURCE[j];
   cout<<endl<<endl;
   cout<<"系统目前各种资源可用的数为(available):"<<endl;
   cout<<" ";
   for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<AVAILABLE[j];
   cout<<endl<<endl;
   cout<<" 各进程还需要的资源量(need):"<<endl<<endl;
   cout<<"       资源0"<<"     资源1"<<"    资源2"<<endl;
   for (i=0;i<M;i++)
   for (i=0;i<M;i++)
   {
     cout<<"进程p"<<i<<":   ";
     for (j=0;j<N;j++)cout<<NEED[i][j]<<"        ";;
     cout<<endl;
   }
   cout<<endl;
   cout<<" 各进程已经得到的资源量(allocation): "<<endl<<endl;
   cout<<"       资源0"<<"     资源1"<<"     资源2"<<endl;
   for (i=0;i<M;i++)
   {
     cout<<"进程p"<<i<<":    ";
     for (j=0;j<N;j++)cout<<ALLOCATION[i][j]<<"       ";
     cout<<endl;
   }
   cout<<endl;
}
void changdata(int k) //函数changdata,改变可用资源和已经拿到资源和还需要的资源的值
{
   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) //函数rstordata,恢复可用资源和已经拿到资源和还需要的资源的值
{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) //函数chkerr,检查是否安全
{  int WORK,FINISH[W];
    int i,j,k=0;
    for(i=0;i<M;i++)FINISH[i]=FALSE;
    for(j=0;j<N;j++)
 {
  WORK=AVAILABLE[j];
        i=s;
        do
  {
          if(FINISH[i]==FALSE&&NEED[i][j]<=WORK)
  {
   WORK=WORK+ALLOCATION[i][j];
              FINISH[i]=TRUE;
              i=0;
  }
          else
  { i++;
  }
  }while(i<M);
        for(i=0;i<M;i++)
        if(FINISH[i]==FALSE)
  {
        cout<<endl;
           cout<<" 系统不安全!!! 本次资源申请不成功!!!"<<endl;
           cout<<endl;
           return 1;
  }
 }
    cout<<endl;
    cout<<" 经安全性检查,系统安全,本次分配成功。"<<endl;
    cout<<endl;
    return 0;
}
void bank()   //银行家算法
{
     int i=0,j=0;
     char flag='Y';
    
     while(flag=='Y'||flag=='y')
 {
       i=-1;
       while(i<0||i>=M)
    {
         cout<<" 请输入需申请资源的进程号(从P0到P"<<M-1<<",否则重输入!):";
         cout<<"p";cin>>i;
         if(i<0||i>=M)cout<<" 输入的进程号不存在,重新输入!"<<endl;
    }
      cout<<" 请输入进程P"<<i<<"申请的资源数:"<<endl;
     for (j=0;j<N;j++)
 {
        cout<<" 资源"<<j<<": ";
        cin>>Request[j];
      if(Request[j]>NEED[i][j]) //若请求的资源数大于进程还需要i类资源的资源量j
 {
         cout<<" 进程P"<<i<<"申请的资源数大于进程P"<<i<<"还需要"<<j<<"类资源的资源量!";
         cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
         flag='N';
         break;
 }
    else
 {
     if(Request[j]>AVAILABLE[j]) //若请求的资源数大于可用资源数
 {
      cout<<" 进程P"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的资源量!";
      cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
     flag='N';
      break;
  }
 }
 }
     if(flag=='Y'||flag=='y')
 {
      changdata(i); //调用changdata(i)函数,改变资源数
      if(chkerr(i)) //若系统安全
 {
         rstordata(i); //调用rstordata(i)函数,恢复资源数
         showdata();   //输出资源分配情况
 }
      else       //若系统不安全
      showdata(); //输出资源分配情况
 }
      else      //若flag=N||flag=n
      showdata();
      cout<<endl;
      cout<<" 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ";
      cin>>flag;
 }
}
void main() //主函数
{
   int i=0,j=0,p;
   cout<<"请输入总进程数:"<<endl;
   cin>>M;
   cout<<"请输入总资源种类:"<<endl;
   cin>>N;
   cout<<"请输入总资源数(all_resource):"<<endl;
   for(i=0;i<N;i++)
   cin>>ALL_RESOURCE[i];
   cout<<"依次输入各进程所需要的最大资源数量(max):"<<endl;
   for (i=0;i<M;i++)
   {
      for (j=0;j<N;j++)
     {
        do
         {
          cin>>MAX[i][j];
          if (MAX[i][j]>ALL_RESOURCE[j])
          cout<<endl<<"占有资源超过了声明的该资源总数,请重新输入"<<endl;
          }while (MAX[i][j]>ALL_RESOURCE[j]);
      }
}
cout<<"依次输入各进程已经占据的资源数量(allocation):"<<endl;
for (i=0;i<M;i++)
{
    for (j=0;j<N;j++)
     {
       do
         {
          cin>>ALLOCATION[i][j];
          if (ALLOCATION[i][j]>MAX[i][j])
          cout<<endl<<"占有资源超过了声明的最大资源,请重新输入"<<endl;
          }while (ALLOCATION[i][j]>MAX[i][j]);
         }
     }
     //初始化资源数量
      for (j=0;j<N;j++)
      { p=ALL_RESOURCE[j];
         for (i=0;i<M;i++)
          {
           p=p-ALLOCATION[i][j];//减去已经被占据的资源
           AVAILABLE[j]=p;
           if(AVAILABLE[j]<0)
           AVAILABLE[j]=0;
           }
     }
      for (i=0;i<M;i++)
      for(j=0;j<N;j++)
         NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
      showdata();
      bank();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。 设计目的 1)了解多道程序系统中,多个进程并发执行的资源分配。 2)掌握死锁的产生的原因、产生死锁的必要条件和处理死锁的基本方法。 3)掌握预防死锁的方法,系统安全状态的基本概念。 4)掌握银行家算法,了解资源在进程并发执行中的资源分配策略。 5)理解死锁避免在当前计算机系统不常使用的原因 要求: 设计一个n 个并发进程共享m 个系统资源的系统。进程可动态申请资源和释放资源,系统按各进程的申请动态的分配资源。要求采用银行家算法实现。 提示: (1) 初始化这组进程的最大资源请求和依次申请的资源序列。把各进程已占用和需求资源情况记录在进程控制块中。假定进程控制块的内容包括:进程名,状态,当前申请量,资源需求总量,已占资源量,能执行完标志。其中,进程的状态有:就绪、等待和完成。当系统不能满足进程的资源请求时,进程处于等待态。资源需求总量表示进程运行过程中对资源的总的需求量。 已占资源量表示进程目前已经得到但还未归还的资源量。因此,进程在以后还需要的剩余资源量等于资源需要总量减去已占资源量。显然每个进程的资源需求总量不应超过系统拥有的资源总量。 (2) 银行家算法分配资源的原则是:当某个进程提出资源请求时,假定先分配资源给它,然后查找各进程的剩余请求,检查系统的剩余资源量是否由于进程的分配而导致系统死锁。若能,则让进程等待,否则,让进程的假分配变为真分配。 a) 查找各进程的剩余请求,检查系统的剩余资源量是否能满足其中一进程。如果能,则转b)。 b) 将资源分配给所选的进程,这样,该进程已获得资源最大请求,最终能运行完成。标记这个进程为终止进程,并将其占有的全部资源归还给系统。 重复第a)步和第b)步,直到所有进程都标记为终止进程,或直到一个死锁发生。若所有进程都标记为终止进程,则系统的初始状态是安全的,否则为不安全的。若安全,则正式将资源分配给它,否则,假定的分配作废,让其等待。
以下是一个简单的银行家算法模拟程序的C语言实现: ```c #include <stdio.h> #include <stdbool.h> #define P 5 // 进程数 #define R 3 // 资源数 int available[R]; // 可用资源数 int max[P][R]; // 最大需求矩阵 int allocation[P][R]; // 已分配矩阵 int need[P][R]; // 需求矩阵 bool finish[P]; // 进程是否完成 void init() { // 初始化可用资源数 available[0] = 3; available[1] = 3; available[2] = 2; // 初始化最大需求矩阵 max[0][0] = 7; max[0][1] = 5; max[0][2] = 3; max[1][0] = 3; max[1][1] = 2; max[1][2] = 2; max[2][0] = 9; max[2][1] = 0; max[2][2] = 2; max[3][0] = 2; max[3][1] = 2; max[3][2] = 2; max[4][0] = 4; max[4][1] = 3; max[4][2] = 3; // 初始化已分配矩阵 allocation[0][0] = 0; allocation[0][1] = 1; allocation[0][2] = 0; allocation[1][0] = 2; allocation[1][1] = 0; allocation[1][2] = 0; allocation[2][0] = 3; allocation[2][1] = 0; allocation[2][2] = 2; allocation[3][0] = 2; allocation[3][1] = 1; allocation[3][2] = 1; allocation[4][0] = 0; allocation[4][1] = 0; allocation[4][2] = 2; // 初始化需求矩阵 for (int i = 0; i < P; i++) { for (int j = 0; j < R; j++) { need[i][j] = max[i][j] - allocation[i][j]; } } // 初始化进程是否完成 for (int i = 0; i < P; i++) { finish[i] = false; } } bool is_safe() { int work[R]; for (int i = 0; i < R; i++) { work[i] = available[i]; } bool finish_all = false; while (!finish_all) { bool can_alloc = false; for (int i = 0; i < P; i++) { if (!finish[i]) { bool can_finish = true; for (int j = 0; j < R; j++) { if (need[i][j] > work[j]) { can_finish = false; break; } } if (can_finish) { can_alloc = true; finish[i] = true; for (int j = 0; j < R; j++) { work[j] += allocation[i][j]; } } } } if (!can_alloc) { finish_all = true; for (int i = 0; i < P; i++) { if (!finish[i]) { return false; } } } } return true; } void request(int pid, int request[R]) { bool can_alloc = true; for (int i = 0; i < R; i++) { if (request[i] > need[pid][i] || request[i] > available[i]) { can_alloc = false; break; } } if (can_alloc) { for (int i = 0; i < R; i++) { available[i] -= request[i]; allocation[pid][i] += request[i]; need[pid][i] -= request[i]; } if (is_safe()) { printf("分配成功,安全序列为:"); for (int i = 0; i < P; i++) { if (finish[i]) { printf("%d ", i); } } printf("\n"); } else { printf("分配失败,不安全状态\n"); for (int i = 0; i < R; i++) { available[i] += request[i]; allocation[pid][i] -= request[i]; need[pid][i] += request[i]; } } } else { printf("分配失败,请求资源超过需求或可用资源\n"); } } void show() { printf("当前时刻各进程的资源分配情况:\n"); printf("进程\t最大需求\t已分配\t\t需求\t\t可用资源\n"); for (int i = 0; i < P; i++) { printf("%d\t", i); for (int j = 0; j < R; j++) { printf("%d ", max[i][j]); } printf("\t"); for (int j = 0; j < R; j++) { printf("%d ", allocation[i][j]); } printf("\t\t"); for (int j = 0; j < R; j++) { printf("%d ", need[i][j]); } printf("\t\t"); if (i == 0) { printf("%d %d %d\n", available[0], available[1], available[2]); } else { printf("\n"); } } } int main() { init(); show(); int pid; int request[R]; while (true) { printf("请输入进程编号和请求资源数(格式:pid r1 r2 r3):"); scanf("%d %d %d %d", &pid, &request[0], &request[1], &request[2]); request(pid, request); show(); } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值