银行家算法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; //没有符合条件的进程,则返回假没有安全序列
}
------------------------------------------------
Felix原创,转载请注明出处,感谢博客园!
posted on 2009-05-11 21:15 Felix Fang 阅读(647) 评论(1) 编辑 收藏 举报