VC++实现 操作系统 死锁的避免--银行家算法

来源:互联网 发布:微信办公系统php 编辑:程序博客网 时间:2024/05/17 09:24

      这两天熬夜,从开始写代码的顺利到后来调试时候的繁琐。我都坚持下来了,上一次做生产者消费者的时候,我最终没有坚持自己独立编写代码,在网上找了一部分的代码作参考。但是这次,我下定决心要自己独立完成。终于,完成了。很欣慰,虽然有点小题大做,但是我觉得学习就得这样。从基本做起,脚踏实地。不会就自己钻研。再不会也要坚持思考。直到你真的坚持不下来的时候,往往你就能想出解决方法了。

       代码写完了,异常处理没怎么去做(已经修改了部分代码,并且增加了低级异常处理。)

。也暂时不想了。水平只能先暂时到这儿。代码贴上来,水平有限,欢迎批评指正。就算被喷口水我也愿意听。初始化数据需要键入的有(按顺序输入):

         Available:3 3 2   

                 Max:7 5 3 3 2 2 9 0 2 2 2 2 4 3 3

        Allocation:0 1 0 2 0 0 3 0 2 2 1 1 0 0 2        

       (1P1发出请求Request(1,0,2)

      2P4发出请求Request(3,3,0)

      3P0发出请求Request(0,2,0)

 

 


///实验名称:死锁的避免--银行家算法/////
///实验时间:2009年10月18日完成,在VC++6.0和WINDOWS XP环境下能够运行成功。////////

/*----------------------------------------------------------------*/
/*---------by----软件1084---赖伟威---200811701414-----------------*/

#include <iostream.h>
#include "stdio.h"
//#include "windows.h"

const unsigned short c =  3;//资源类数
const unsigned short t =  5;//进程数

void Print();  //用于打印输出表格的函数
void Input();//用于输入的函数
void tryfenpei(int i);//试分配函数
void refenpei(int i);//恢复数据函数
void checksafe(int s);//安全检测函数

//定义初始化数组
 int Available[c],
  Max[t][c],
  Allocation[t][c],
  Need[t][c],
     Request[c];
 
 int in;//用户选择的进程号
/*----------------------------------------------------------------*/
 int main(int argc, char *argv[])
{
 int i;
 char ch='Y';
 cout<<"初始化数据"<<endl; 
 Input();//输入相关数据函数
 Print();//打印输出相关数据表函数 
 cout<<"初始化完成!..."<<endl<<endl<<endl;
 do
 {
  if(ch=='Y'||ch=='y')
  {
   cout<<"欢迎进入实验!请稍后..."<<endl;
//   Sleep(1000);
   cout<<"已顺利进入实验..."<<endl;
   cout<<"请输入发起请求的进程号(0-4):";
   while(cin>>in)
   {
    if(!(0<=in&&in<=4))
    {
     cout<<"不存在该进程,请重新输入"<<endl;
    }
    else break;
   }; 
   cout<<"您输入的是 "<<"p["<<in<<"]"<<" 进程"<<endl;
   cout<<"该进程需求量为: ";
   for(i=0;i<c;i++)
    cout<<Need[in][i]<<" ";
   cout<<endl;
         cout<<"请输入请求资源的数目:";//输入格式为 X
            for(i=0;i<c;i++)
   {
    while(cin>>Request[i])
    {
     if(Request[i]<0) cout<<"错误!输入的数字无效."<<endl;
     else
      if(Request[i]>Need[in][i]) cout<<"错误!超出进程需求量"<<endl<<endl;
      if(Request[i]>Available[i]) cout<<"错误!系统还没有足够的可用资源量满足进程需要"<<endl<<endl;
      else break;
    }
   }
   cout<<"输入成功,您输入的是:"<<Request[0]<<"  "<<Request[1]<<"  "<<Request[2];
            cout<<endl;
         cout<<"开始执行银行家算法,下面进行试分配..."<<endl;
   tryfenpei(in);//分配函数
            //Sleep(1000);
   cout<<"试分配完成!"<<endl;
            cout<<"进入安全性检测..."<<endl;
         //Sleep(1000);
         checksafe(in);//安全性检测函数
   cout<<"需要继续实验吗?(y-继续 n终止)"; 
  }
  else
   if(ch=='N'||ch=='n')
   {
    cout<<"感谢您的使用,祝您愉快!"<<endl<<"正在退出..."<<endl;
    break;
   }
   else
    cout<<"输入无效!请重新输入."<<endl;
 }
 while(cin>>ch);
 return 0;
 }/*---------------------main函数结束----------------------------------*/


/*-------------------------输出函数----------------------------------*/
void Print()
{
 int i,j;
 cout<<" 进程个数 : "<<t<<"  资源个数: "<<c<<endl;
 cout<<"正在更新数据..."<<endl;
 //Sleep(1500);
 cout<<"|-----|----------|------------|----------|-----------|"<<endl;
 cout<<"|----|最大需求矩阵|已分配矩阵-|-需求矩阵-可用资源向量|"<<endl;
 cout<<"|/ 资源|   Max    | Allocation |    Need  | Available |"<<endl;
 cout<<"|  /   | A  B  C  |  A  B  C   |  A  B  C |   A  B  C |"<<endl;
 cout<<"|进程/ |          |            |          |           |"<<endl;
 cout<<"|-----|----------|------------|----------|-----------|"<<endl;
 for(i=0;i<5;i++)
 {
  cout<<"|  p"<<i<<" | ";
  for(j=0;j<3;j++)
  {
   cout<<Max[i][j]<<"  ";
  }
  cout<<"|";
  for(j=0;j<3;j++) 
  {
   cout<<"  "<<Allocation[i][j];
  }
  cout<<"   |";
  for(j=0;j<3;j++)
  {
   cout<<"  "<<Need[i][j];
  }
  cout<<" |";
  if(i==0)
  {
   for(j=0;j<3;j++)
   {
    cout<<"  "<<Available[j];
   }
   cout<<"  |";
  }
  if(i>0)
  {
   cout<<"           |";
  }
  cout<<endl;
 }
 cout<<"|-----|----------|------------|----------|-----------|"<<endl;    
}/*-------------------------输出函数结束--------------------------------*/


/*--------------------------输入函数----------------------------------*/
void Input()
{
 for(int j=0;j<c;j++)
 {
  cout<<"请输入 Available["<<j<<"]:";
  while(cin>>Available[j])
  {
   if(Available[j]<0)
    cout<<"输入数字无效,请重新输入"<<endl;
   else break;
  };
 } 
 for(int k=1;k<4;k++)//其他三个属性和一次打印输出表
 {  
  for(int l=0;l<t;l++)//五个进程循环输入
  {
       for(int m=0;m<c;m++)//三个类资源ABC循环输入
    {
    if(k==1&&m<t)
    {
     cout<<"请输入 Max["<<l<<"]["<<m<<"]:";
     while(cin>>Max[l][m])
     {
      if(Max[l][m]<0)
       cout<<"输入数字无效,请重新输入"<<endl;
      else break;
     };
    }
    if(k==2&&m<t)
    {
     cout<<"请输入 Allocation["<<l<<"]["<<m<<"]:";
     while(cin>>Allocation[l][m])
     if(Allocation[l][m]<0)
       cout<<"输入数字无效,请重新输入"<<endl;
      else break;
     //cout<<"Allocation["<<l<<"]["<<m<<"]="<<Allocation[l][m]<<endl;
    }
    if(k==3&&m<t)
     Need[l][m]=Max[l][m]-Allocation[l][m]; 
    }
  }
 } 
}//*-------------------------输入函数结束----------------------------------*/

/*-------------------------试分配函数----------------------------------*/
void tryfenpei(int i)
{
 for(int f=0;f<c;f++)
 {
  Available[f] = Available[f] - Request[f];
     Allocation[i][f] = Allocation[i][f] + Request[f];
     Need[i][f] = Need[i][f]-Request[f];
 }
}/*-------------------------试分配函数结束----------------------------------*/

/*-------------------------恢复数据函数----------------------------------*/
void refenpei(int i)
{
 for(int f=0;f<c;f++)
 {
  Available[f] = Available[f] + Request[f];
     Allocation[i][f] = Allocation[i][f] - Request[f];
     Need[i][f] = Need[i][f]+Request[f];
  //cout<<Available[f]<<" "<<Allocation[i][f]<<" "<<Need[i][f]<<endl;
 }
}/*-------------------------恢复数据函数结束----------------------------------*/

/*-------------------------安全检测函数----------------------------------*/
void checksafe(int s)
{
 int Work,
  flag,
  temp[t],
  i,j,l=0,k=0;
    bool Finish[t];
    for(i=0;i<t;i++)
  Finish[i]=false;
    for(j=0;j<3;j++)
 {
  Work=Available[j];//cout<<"Work="<<Work<<endl;
  for(i=0;i<t;i++)
  {
   if(Finish[i]==true) l++;//用l是否达到5来判断这条进程A类资源或者B类资源是否通过安全检测,C类资源没有经过这里 
  }
  if(l==5)//一共有三类资源A B C,一条进程下面的安全性检测只检测了A类。如果A类通过了,那么还要判断B类,C类。否则不用
  {
   for(i=0;i<t;i++) Finish[l]=false;//A类通过了,就把B类的Finish重置为false,C类类推

  }
  i=s;//s传递进来赋给i,s是用户输入的进程号(有主函数里的in传递进来)
        while(i<t)
  {
   
   if (Finish[i]==false&&Need[i][j]<=Work)
   {
    Work=Work+Allocation[i][j];
                Finish[i]=true;
                temp[k]=i;//cout<<"temp="<<temp[k]<<endl;
                k++;
                i=(i+1)%t;//从用户选择的进程开始对每个进程都要检测
   }
            else  i=(i++)%t;   
  }        
 } 
 for(i=0;i<t;i++)
 {
  if(Finish[i]==false)
  {
            flag=1;//标记
  }
 } 
 if(flag==1)
 {
  cout<<"系统不安全!!! 本次资源申请不成功!!!"<<endl;
     cout<<"正在恢复原来的数据..."<<endl;
//  Sleep(1000);
      refenpei(in);
     cout<<"恢复数据成功!正在打印输出..."<<endl;
//  Sleep(1000);
     Print();
 }
 else
 {
  cout<<"找到一个安全序列:";
        for(i=0;i<t;i++)
    cout<<"P"<<temp[i]<<"--->";
//  Sleep(1000);
  cout<<endl<<"已通过安全性测试!"<<endl;
  cout<<"开始给第 "<<"p["<<in<<"]"<<"进程分配资源..."<<endl;
//  Sleep(1000);
     cout<<"分配完成!打印输出..."<<endl;
//     Sleep(1000);
  Print();
        cout<<endl;
 }
}
/*-------------------------安全检测函数结束----------------------------------*/

 

 

原创粉丝点击