银行家算法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;                   //没有符合条件的进程,则返回假没有安全序列

}

 

posted on 2009-05-11 21:15  Felix Fang  阅读(644)  评论(1编辑  收藏  举报

导航