zoukankan      html  css  js  c++  java
  • 银行家算法C++实现

          虽然这是一个操作系统的用来避免死锁的算法,其实完全可以把它当做一道ACM题来做。寻找安全序列上面我使用了回溯算法,条例还算清晰,发上来和大家共享同时备忘。

         

    #include<iostream>
    using namespace std;
    #include<fstream>
    #include<cstdlib>
    int available[3] = {3,3,2}; //available矩阵
    int allocation[5][3] = {0}; //allocation矩阵
    int maxN[5][3] = {0};       //max矩阵
    int need[5][3] = {0};       //need矩阵
    int p[5] = {0};
    int request[5] = {0};       //request序列
    bool record[5] = {0};       //record用于记录找过的进程
    bool judge( int );          //判断当前状态是否死锁的函数

    这里只列出判断函数judge(int v)的定义,main函数就不写了,该咋写咋写吧。

    bool judge( int v )                //判断是否会产生死锁的函数,用回溯算法
    {
         if( v >= 5 )                    //参数v表示当前正在找第v个符合条件的进程,
                 return true;             //能找完,表明存在安全序列 ,返回真
         for( int k = 0;k < 5;k++ )
         {
                  if( !record[k] && need[k][0] <= available[0] && need[k][1] <= available[1] && need[k][2] <= available[2] )
                  {
                      cout<<"Select Process "<<k<<endl;//找到一个符合当前条件的进程
                      record[k] = true;                //假定是真确的,往下执行
                      for( int j = 0;j < 3;j++ )
                          available[j] += allocation[k][j];
                      cout<<"avilable:";
                      for( int l = 0;l < 3;l++ )
                           cout<<available[l]<<" ";
                      cout<<endl;
                      if( judge( v+1 ) )           //判断执行这一步后结果是否为真
                      {
                          p[v] = k;                //是的话,记录路径
                          return true;          
                      }
                      else
                      {
                          cout<<"This selection is wrong, back.\n";
                          record[k] = false;       //若不是,还原操作,往下寻找
                          for( int i = 0;i < 3;i++ )
                          available[i] -= allocation[k][i];
                      }
                     
                  }
         }
         return false;                   //没有符合条件的进程,则返回假没有安全序列

    }

     

  • 相关阅读:
    大话领域驱动
    c#之循环效率
    编程思想之——"人是活的,程序是死的"
    C#之系统异常处理机制
    EF操作扩展之async
    C#提供APP接口之JSON差异
    EF操作MySql
    WCF 消息压缩性能问题及解决方法
    [NoSQL]-Elasticsearch 7.9
    [Linux]-Debian10基础使用
  • 原文地址:https://www.cnblogs.com/felixfang/p/1454450.html
Copyright © 2011-2022 走看看