21xrx.com
2024-12-22 21:00:06 Sunday
登录
文章检索 我的文章 写文章
C++实现银行家算法的代码
2023-06-29 02:54:19 深夜i     --     --
C++ 银行家算法 实现 代码

银行家算法是一种用于避免死锁的算法。它最初由艾兹格·迪科斯彻在1965年所提出,后来由著名计算机科学家埃德加·科克斯(Edsger Dijkstra)在1972年进一步完善,因此也被称作迪科斯彻-科克斯算法。该算法通过对系统资源的状态进行监测和分析,从而判断是否会发生死锁,并采取相应措施避免死锁事件的发生。

在现代程序设计中,C++语言是广泛应用的一种编程语言。其特有的面向对象思想以及高效的执行效率,使其成为众多开发人员所喜欢的语言之一。因此,使用C++语言编写并实现银行家算法代码是情理之中的事情。下面是一个简单的银行家算法的C++实现代码:


#include<iostream>

#include<cstdio>

using namespace std;

const int N = 1000;

int n, m; //n代表进程数,m代表资源数

int available[N], maxn[N][N], allocation[N][N], need[N][N]; //定义需要的各类数组

void input() //输入函数

{

  cout << "请输入进程数n和资源数m:" << endl;

  cin >> n >> m;

  cout << "请输入各个进程最大的资源需求量:" << endl;

  for(int i = 1; i <= n; i++)

  {

    for(int j = 1; j <= m; j++)

    {

      cin >> maxn[i][j];

    }

  }

  cout << "请输入各个进程已经拥有的资源数量:" << endl;

  for(int i = 1; i <= n; i++)

  {

    for(int j = 1; j <= m; j++)

    {

      cin >> allocation[i][j];

    }

  }

  cout << "请输入系统当前剩余的资源量:" << endl;

  for(int i = 1; i <= m; i++)

  {

    cin >> available[i];

  }

}

void check() //资源状态检查函数

{

  int flag = 0; //flag用于标记该资源状态是否合法

  int count = 0; //count用于计数

  bool finish[N] = {0}; //finish用于标记是否完成当前进程

  for(int i = 1; i <= n; i++) //对所有进程进行遍历

  {

    if(finish[i] == 0) //如果当前进程未执行完成

    {

      flag = 1; //设标记为1

      for(int j = 1; j <= m; j++) //遍历该进程的资源需求对应数组

      {

        if(need[i][j] > available[j]) //如果当前资源不足够满足该进程的需求

        

          flag = 0; //标记该资源状态不合法

          break; //跳出循环

        

      }

      if(flag == 1) //若标记为1,说明该资源状态合法

      {

        for(int j = 1; j <= m; j++) //遍历该进程的资源需求对应数组

        {

          available[j] += allocation[i][j]; //将该进程所拥有的资源释放

        }

        finish[i] = 1; //标记该进程为已完成状态

        count++; //计数器加1

      }

    }

  }

  if(count == n) //如果所有进程都已执行完成

  

    cout << "当前资源状态安全!" << endl; //输出当前资源状态安全

  

  else //否则

  

    cout << "当前资源状态不安全!" << endl; //输出当前资源状态不安全

  

}

int main()

{

  input(); //调用输入函数

  for(int i = 1; i <= n; i++) //初始化所需数组

  {

    for(int j = 1; j <= m; j++)

    {

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

    }

  }

  check(); //调用状态检查函数

  return 0;

}

在上述代码中,使用了输入函数、资源状态检查函数以及主函数三部分。首先在输入函数中输入所需的数据,其中包括进程数、资源数、进程所需的最大资源需求量、已经拥有的资源数量以及系统当前剩余的资源量。接着在主函数中,对所需的数组进行初始化,并调用状态检查函数来判断当前系统的资源状态是否合法。如果资源状态合法,则输出当前资源状态安全;否则,输出当前资源状态不安全。

总之,通过C++语言实现银行家算法,可以方便地检查当前系统资源状态是否安全,并且可以有效地避免发生死锁事件。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复