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

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

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

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

         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;
 }
}
/*-------------------------安全检测函数结束----------------------------------*/

 

 

5 银行家算法实现 5.1 实验类型 设计型(4学时)。 5.2 实验目的 1) 理解死锁避免相关内容; 2) 掌握银行家算法主要流程; 3) 掌握安全性检查流程。 5.3 实验描述 本实验主要对操作系统中的死锁预防部分的理论进行实验。要求实验者设计一个程序,该程序可对每一次资源申请采用银行家算法进行分配。 5.4 实验内容 1) 设计多个资源(≥3); 2) 设计多个进程(≥3); 3) 设计银行家算法相关的数据结构; 4) 动态进行资源申请、分配、安全性检测并给出分配结果。 5.5 实验要求 1) 编写程序完成实验内容; 2) 画出安全性检测函数流程图; 3) 撰写实验报告。 5.6 测试要求 1) 进行Request请求,输入参数为进程号、资源号和资源数; 2) 进行3次以上的Request请求; 3) 至少进行1次资源数目少于可用资源数,但不安全的请求。 5.7 相关知识 5.7.1 银行家算法的数据结构 1) 可利用资源向量Available。其中每个元素代表每类资源的数目。 2) 最大需求矩阵Max。其中每个元素代表每个进程对于每类资源的最大需求量。Max[i,j]=K表示i进程对于j类资源的最大需求量为K。 3) 分配矩阵Allocation。其中每个元素代表每个进程已得到的每类资源的数目。 4) 需求矩阵Need。其中每个元素代表每个进程还需要的每类资源的数目。 5.7.2 银行家算法 Request i [j]=K表示进程Pi需要K个j类资源。 1) 如果Request i [j]≤Need[i , j],便转向步骤2,否则认为出错。 2) 如果Request i [j]≤Available[j],便转向步骤3,否则表示无足够资源,Pi需等待; 3) 系统尝试分配资源给Pi; 4) 系统进行安全性检查,检查此次资源分配后,系统是否安全。如果安全,则正式分配资源,否则撤销此次分配。 5.7.3 安全性算法 1) 设置两个向量:工作向量Work和Finish。算法开始时Work=Available;Finish表示系统是否有足够的资源分配给进程,使之运行完成,开始时,令Finish[i]=False;如果有足够的资源分配给进程,则令Finish[i]=True。 2) 从进程集合中找到一个能满足下列条件的进程:Finish[i]=False;Need[i,j] ≤ Work[j],若找到,执行步骤3),否则,执行步骤4); 3) Pi获得所需资源后,可顺利执行指导完成,并释放它占有的资源。并执行: Work[j]=Work[j]+Allocation[i , j]; Finish[i] = True; 到第2)步。 4) 直到所有Finish[i]=True,表示系统处于安全状态;否则系统处于不安全状态。 5.8 实验设备 PC机1台,要求安装DOS7.1、Turbo C3.0、Windows2000。 5.9 实验成绩评定 实验成绩评定方式包含实验报告成绩、实验过程成绩两个部分,其中实验过程成绩占60%、实验报告成绩占40%,如果其中任何一个部分成绩不及格,则总成绩按不及格处理。 5.10 实验报告 按照实验目的、实验内容、实验要求、实验设备、测试等部分进行组织。 5.11 实验思考 1) 针对死锁有哪些可行方案? 2) 死锁解除的难点是什么?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值