来自「动态资源分配系统的设计 目的与要求: 本设计的目的是通过编写和调试一个系统动」· 代码 · 共 746 行 · 第 1/2 页

TXT
746
字号
       else
      {
       
       system.AlterAvai(Printer,system.Available(Printer)-p1.Request(Printer));  //修改现有Printer数量
                   system.AlterAvai(Disk,system.Available(Disk)-p1.Request(Disk));  //修改现有Disk数量
                   system.AlterAvai(CDROM,system.Available(CDROM)-p1.Request(CDROM));  //修改现有CDROM数量

       p1.AlterAlloc(Printer,p1.Allocation(Printer)+p1.Request(Printer) );  //修改已经得到的Printer数量
                   p1.AlterAlloc(Disk,p1.Allocation(Disk)+p1.Request(Disk));  //修改已经得到的Disk数量
                   p1.AlterAlloc(CDROM,p1.Allocation(CDROM)+p1.Request(CDROM));  //修改已经得到的CDROM数量
                    
       if(SafeCheck(p0,p1,p2,p3,p4))
       {
       cout<<endl;
                      cout<<"亲爱的,恭喜你! 资源分配安全,可以分配,分配以后的资源分配表如下:"<<endl;
          system.PutTable(p0,p1,p2,p3,p4);
       }
       else
       {
        cout<<endl;
        cout<<"宝贝对不起!为了系统的安全你申请的资源将得不到分配!"<<endl;
        
        //恢复原来的资源分配状态
        system.AlterAvai(Printer , system.Available(Printer)+p1.Request(Printer) );  
        system.AlterAvai(Disk , system.Available(Disk)+p1.Request(Disk) );
        system.AlterAvai(CDROM , system.Available(CDROM)+p1.Request(CDROM) );

        p1.AlterAlloc(Printer , p1.Allocation(Printer)-p1.Request(Printer) );
        p1.AlterAlloc(Disk , p1.Allocation(Disk)-p1.Request(Disk) );
        p1.AlterAlloc(CDROM , p1.Allocation(CDROM)-p1.Request(CDROM) );
       }

       
      }
     break;
   case 2:
    p2.AcceReq(Num_R);  //把要申请的资源数量存入
           //下面开始银行家算法
               if(p2.Request(Printer)>p2.Need(Printer) || p2.Request(Disk)>p2.Need(Disk) 
           || p2.Request(CDROM)>p2.Need(CDROM) )
      {
              cout<<"你输入错了!";
      }

               else if(p2.Request(Printer)>system.Available(Printer) || p2.Request(Disk)>system.Available(Disk)
               || p2.Request(CDROM)>system.Available(CDROM) )
      {
               cout<<"资源数量不够,请等待!"<<endl;
      }
       else
      {
       
       system.AlterAvai(Printer,system.Available(Printer)-p2.Request(Printer));  //修改现有Printer数量
                   system.AlterAvai(Disk,system.Available(Disk)-p2.Request(Disk));  //修改现有Disk数量
                   system.AlterAvai(CDROM,system.Available(CDROM)-p2.Request(CDROM));  //修改现有CDROM数量

       p2.AlterAlloc(Printer,p2.Allocation(Printer)+p2.Request(Printer) );  //修改已经得到的Printer数量
                   p2.AlterAlloc(Disk,p2.Allocation(Disk)+p2.Request(Disk));  //修改已经得到的Disk数量
                   p2.AlterAlloc(CDROM,p2.Allocation(CDROM)+p2.Request(CDROM));  //修改已经得到的CDROM数量
                    
       if(SafeCheck(p0,p1,p2,p3,p4))
       {
       cout<<endl;
                      cout<<"亲爱的,恭喜你! 资源分配安全,可以分配,分配以后的资源分配表如下:"<<endl;
          system.PutTable(p0,p1,p2,p3,p4);
       }
       else
       {
        cout<<endl;
        cout<<"宝贝对不起!为了系统的安全你申请的资源将得不到分配!"<<endl;
        
        //恢复原来的资源分配状态
        system.AlterAvai(Printer , system.Available(Printer)+p2.Request(Printer) );  
        system.AlterAvai(Disk , system.Available(Disk)+p2.Request(Disk) );
        system.AlterAvai(CDROM , system.Available(CDROM)+p2.Request(CDROM) );

        p2.AlterAlloc(Printer , p2.Allocation(Printer)-p2.Request(Printer) );
        p2.AlterAlloc(Disk , p2.Allocation(Disk)-p2.Request(Disk) );
        p2.AlterAlloc(CDROM , p2.Allocation(CDROM)-p2.Request(CDROM) );
       }

       
      }


    break;
   case 3:
    p3.AcceReq(Num_R);  //把要申请的资源数量存入
           //下面开始银行家算法
               if(p3.Request(Printer)>p3.Need(Printer) || p3.Request(Disk)>p3.Need(Disk) 
         || p3.Request(CDROM)>p3.Need(CDROM) )
      {
              cout<<"你输入错了!";
      }

               else if(p3.Request(Printer)>system.Available(Printer) || p3.Request(Disk)>system.Available(Disk)
              || p3.Request(CDROM)>system.Available(CDROM) )
      {
               cout<<"资源数量不够,请等待!"<<endl;
      }
       else
      {
       
       system.AlterAvai(Printer,system.Available(Printer)-p3.Request(Printer));  //修改现有Printer数量
                   system.AlterAvai(Disk,system.Available(Disk)-p3.Request(Disk));  //修改现有Disk数量
                   system.AlterAvai(CDROM,system.Available(CDROM)-p3.Request(CDROM));  //修改现有CDROM数量

       p3.AlterAlloc(Printer,p3.Allocation(Printer)+p3.Request(Printer) );  //修改已经得到的Printer数量
                   p3.AlterAlloc(Disk,p3.Allocation(Disk)+p3.Request(Disk));  //修改已经得到的Disk数量
                   p3.AlterAlloc(CDROM,p3.Allocation(CDROM)+p3.Request(CDROM));  //修改已经得到的CDROM数量
                    
       if(SafeCheck(p0,p1,p2,p3,p4))
       {
       cout<<endl;
                      cout<<"亲爱的,恭喜你! 资源分配安全,可以分配,分配以后的资源分配表如下:"<<endl;
          system.PutTable(p0,p1,p2,p3,p4);
       }
       else
       {
        cout<<endl;
        cout<<"宝贝对不起!为了系统的安全你申请的资源将得不到分配!"<<endl;
        
        //恢复原来的资源分配状态
        system.AlterAvai(Printer , system.Available(Printer)+p3.Request(Printer) );  
        system.AlterAvai(Disk , system.Available(Disk)+p3.Request(Disk) );
        system.AlterAvai(CDROM , system.Available(CDROM)+p3.Request(CDROM) );

        p3.AlterAlloc(Printer , p3.Allocation(Printer)-p3.Request(Printer) );
        p3.AlterAlloc(Disk , p3.Allocation(Disk)-p3.Request(Disk) );
        p3.AlterAlloc(CDROM , p3.Allocation(CDROM)-p3.Request(CDROM) );
       }

       
      }


    break;
   case 4:
    p4.AcceReq(Num_R);  //把要申请的资源数量存入
           //下面开始银行家算法
               if(p4.Request(Printer)>p4.Need(Printer) || p4.Request(Disk)>p4.Need(Disk) 
          || p4.Request(CDROM)>p4.Need(CDROM) )
      {
              cout<<"你输入错了!";
      }

               else if(p4.Request(Printer)>system.Available(Printer) || p4.Request(Disk)>system.Available(Disk) 
              || p4.Request(CDROM)>system.Available(CDROM) )
      {
               cout<<"资源数量不够,请等待!"<<endl;
      }
       else
      {
       
       system.AlterAvai(Printer,system.Available(Printer)-p4.Request(Printer));  //修改现有Printer数量
                   system.AlterAvai(Disk,system.Available(Disk)-p4.Request(Disk));  //修改现有Disk数量
                   system.AlterAvai(CDROM,system.Available(CDROM)-p4.Request(CDROM));  //修改现有CDROM数量

       p4.AlterAlloc(Printer,p4.Allocation(Printer)+p4.Request(Printer) );  //修改已经得到的Printer数量
                   p4.AlterAlloc(Disk,p4.Allocation(Disk)+p4.Request(Disk));  //修改已经得到的Disk数量
                   p4.AlterAlloc(CDROM,p4.Allocation(CDROM)+p4.Request(CDROM));  //修改已经得到的CDROM数量
                    
       if(SafeCheck(p0,p1,p2,p3,p4))
       {
       cout<<endl;
                      cout<<"亲爱的,恭喜你! 资源分配安全,可以分配,分配以后的资源分配表如下:"<<endl;
          system.PutTable(p0,p1,p2,p3,p4);
       }
       else
       {
        cout<<endl;
        cout<<"宝贝对不起!为了系统的安全你申请的资源将得不到分配!"<<endl;
        
        //恢复原来的资源分配状态
        system.AlterAvai(Printer , system.Available(Printer)+p4.Request(Printer) );  
        system.AlterAvai(Disk , system.Available(Disk)+p4.Request(Disk) );
        system.AlterAvai(CDROM , system.Available(CDROM)+p4.Request(CDROM) );

        p4.AlterAlloc(Printer , p4.Allocation(Printer)-p4.Request(Printer) );
        p4.AlterAlloc(Disk , p4.Allocation(Disk)-p4.Request(Disk) );
        p4.AlterAlloc(CDROM , p4.Allocation(CDROM)-p4.Request(CDROM) );
       }

       
      }


    break;
   default:
    break;

 }
}

 


int System::SafeCheck(Process p0,Process p1,Process p2,Process p3,Process p4)
{
 int work[3]={Available(Printer),Available(Disk),Available(CDROM)};  //工作向量初始化
 Code  AllPro[6]={0,1,2,3,4,888};  //初始化进程集合  888为哨兵
    
 int count=0;
    while(AllPro[0]!=888 && count<=5)  //当进程集合不为空时
 {
  if(p0.Need(Printer)<=work[0] && p0.Need(Disk)<=work[1] && p0.Need(CDROM)<=work[2])   //若找到0号进程满足
  {
   work[0]+=p0.Allocation(Printer);  //修改工作向量
   work[1]+=p0.Allocation(Disk);
   work[2]+=p0.Allocation(CDROM);

   DelPro(AllPro,0);  //从进程集合中删除0号进程
  }

  if(p1.Need(Printer)<=work[0] && p1.Need(Disk)<=work[1] && p1.Need(CDROM)<=work[2])   //若找到0号进程满足
  {
   work[0]+=p1.Allocation(Printer);  //修改工作向量
   work[1]+=p1.Allocation(Disk);
   work[2]+=p1.Allocation(CDROM);

   DelPro(AllPro,1);  //从进程集合中删除1号进程
  }

  if(p2.Need(Printer)<=work[0] && p2.Need(Disk)<=work[1] && p2.Need(CDROM)<=work[2])   //若找到0号进程满足
  {
   work[0]+=p2.Allocation(Printer);  //修改工作向量
   work[1]+=p2.Allocation(Disk);
   work[2]+=p2.Allocation(CDROM);

   DelPro(AllPro,2);  //从进程集合中删除2号进程
  }

  if(p3.Need(Printer)<=work[0] && p3.Need(Disk)<=work[1] && p3.Need(CDROM)<=work[2])   //若找到0号进程满足
  {
   work[0]+=p3.Allocation(Printer);  //修改工作向量
   work[1]+=p3.Allocation(Disk);
   work[2]+=p3.Allocation(CDROM);

   DelPro(AllPro,3);  //从进程集合中删除3号进程
  }

  if(p4.Need(Printer)<=work[0] && p4.Need(Disk)<=work[1] && p4.Need(CDROM)<=work[2])   //若找到0号进程满足
  {
   work[0]+=p4.Allocation(Printer);  //修改工作向量
   work[1]+=p4.Allocation(Disk);
   work[2]+=p4.Allocation(CDROM);

   DelPro(AllPro,4);  //从进程集合中删除4号进程
  }

       count++;

 }

 if(888==AllPro[0])
 {
  return 1;
 }

 else 
  return 0;



}


void System::PutTable(Process p0,Process p1,Process p2,Process p3,Process p4)   //打印资源分配表
{
 cout<<endl;
 cout<<"                            此时刻的资源分配表:                               "<<endl;
 cout<<" -----------------------------------------------------------------------------"<<endl;
 cout<<"   资源情况        Max          Allocation        Need          Available"<<endl;
 cout<<" 进程          Pr   D   CD     Pr   D   CD     Pr   D   CD     Pr   D   CD   "<<endl;
 cout<<"  p0";/*输出对相应资源的最大申请量*/  cout<<"           "<<p0.Max(Printer)<<"    "<<p0.Max(Disk)<<"   "<<p0.Max(CDROM); /*输出进程已经获得的相应资源的数量*/cout<<"      "<<p0.Allocation(Printer)<<"    "<<p0.Allocation(Disk)<<"   "<<p0.Allocation(CDROM);/*输出进程还需要的相应资源的数量*/cout<<"      "<<p0.Need(Printer)<<"    "<<p0.Need(Disk)<<"   "<<p0.Need(CDROM);/*输出系统现有的相应资源的数量*/cout<<"      "<<Available(Printer)<<"    "<<Available(Disk)<<"   "<<Available(CDROM)<<endl;
 cout<<""<<endl;
 cout<<"  p1";/*输出对相应资源的最大申请量*/  cout<<"           "<<p1.Max(Printer)<<"    "<<p1.Max(Disk)<<"   "<<p1.Max(CDROM); /*输出进程已经获得的相应资源的数量*/cout<<"      "<<p1.Allocation(Printer)<<"    "<<p1.Allocation(Disk)<<"   "<<p1.Allocation(CDROM);/*输出进程还需要的相应资源的数量*/cout<<"      "<<p1.Need(Printer)<<"    "<<p1.Need(Disk)<<"   "<<p1.Need(CDROM)<<endl;      
 cout<<""<<endl;
 cout<<"  p2";/*输出对相应资源的最大申请量*/  cout<<"           "<<p2.Max(Printer)<<"    "<<p2.Max(Disk)<<"   "<<p2.Max(CDROM); /*输出进程已经获得的相应资源的数量*/cout<<"      "<<p2.Allocation(Printer)<<"    "<<p2.Allocation(Disk)<<"   "<<p2.Allocation(CDROM);/*输出进程还需要的相应资源的数量*/cout<<"      "<<p2.Need(Printer)<<"    "<<p2.Need(Disk)<<"   "<<p2.Need(CDROM)<<endl;
 cout<<""<<endl;
 cout<<"  p3";/*输出对相应资源的最大申请量*/  cout<<"           "<<p3.Max(Printer)<<"    "<<p3.Max(Disk)<<"   "<<p3.Max(CDROM); /*输出进程已经获得的相应资源的数量*/cout<<"      "<<p3.Allocation(Printer)<<"    "<<p3.Allocation(Disk)<<"   "<<p3.Allocation(CDROM);/*输出进程还需要的相应资源的数量*/cout<<"      "<<p3.Need(Printer)<<"    "<<p3.Need(Disk)<<"   "<<p3.Need(CDROM)<<endl;
 cout<<""<<endl;
 cout<<"  p4";/*输出对相应资源的最大申请量*/  cout<<"           "<<p4.Max(Printer)<<"    "<<p4.Max(Disk)<<"   "<<p4.Max(CDROM); /*输出进程已经获得的相应资源的数量*/cout<<"      "<<p4.Allocation(Printer)<<"    "<<p4.Allocation(Disk)<<"   "<<p4.Allocation(CDROM);/*输出进程还需要的相应资源的数量*/cout<<"      "<<p4.Need(Printer)<<"    "<<p4.Need(Disk)<<"   "<<p4.Need(CDROM)<<endl;
 cout<<""<<endl; 
 cout<<" ------------------------------------------------------------------------------"<<endl;
 
}


 

 

 


/*    为了操作的方便,此程序做了许多简便的处理,首先让此程序规定有5个进程在系统中运行,并在程序中就
  规定每个进程对各类资源的的最大申请量跟已经获得的相应资源的数量。
      程序运行时,通过用户的手动输入让系统拥有一定的资源,然后用户提出让哪个进程申请资源,并提供申请各类
  的数量。
      系统接收到进程的请求后,若通过死锁安全检查,则分配资源,并修改相应参数;若不能通过安全检查则不予分配,返回。*/

 

 

 


//主函数文件
#include"Process.cpp"
#include"System.cpp"
#include<iostream.h>

 

void main()
{
 int Num_P,Num_D,Num_CD;
 cout<<"请分别输入系统现有的资源数量:"<<endl;  //系统现有资源初始化
 cout<<"打印机(Printer):";  cin>>Num_P;
 cout<<"磁盘(Disk):";   cin>>Num_D;
 cout<<"光驱(CDROM)";    cin>>Num_CD;
 System system(Num_P,Num_D,Num_CD);  //系统对象

 int Num_M0[3]={7,5,3};  //0号进程对三类资源的最大申请量
 int Num_A0[3]={0,1,0};  //0号进程已经获得的三类资源数量
 Process p0(Num_M0,Num_A0);

 int Num_M1[3]={3,2,2};  //1号进程对三类资源的最大申请量
 int Num_A1[3]={2,0,0};  //1号进程已经获得的三类资源数量
 Process p1(Num_M1,Num_A1);

 int Num_M2[3]={9,0,2};  //2号进程对三类资源的最大申请量
 int Num_A2[3]={3,0,2};  //2号进程已经获得的三类资源数量
 Process p2(Num_M2,Num_A2);

 int Num_M3[3]={2,2,2};  //3号进程对三类资源的最大申请量
 int Num_A3[3]={2,1,1};  //3号进程已经获得的三类资源数量
 Process p3(Num_M3,Num_A3);

 int Num_M4[3]={4,3,3};  //4号进程对三类资源的最大申请量
 int Num_A4[3]={0,0,2};  //4号进程已经获得的三类资源数量
 Process p4(Num_M4,Num_A4);

    system.PutTable(p0,p1,p2,p3,p4);  //输出资源分配表

 //下面开始进程申请资源的管理
    int NumberP;int Num_R[3];  //一个用来保存输入要申请资源的进程号,一个用来保存进程对资源的申请
 cout<<"请输入你要哪个进程申请资源(0->p0;1->p1;2->p2;3->p3;4->p4;100->退出)";  cin>>NumberP; 

 while(NumberP!=100)
 {
    if(NumberP>100 || NumberP<0 || NumberP>4&&NumberP<100)  //防止输入有误
    {
    cout<<"你的输入有误!程序已退出!"<<endl;
    char c; cin>>c;
    return;
    }
       cout<<"请输入要申请打印机(Printer)的数量:";   cin>>Num_R[0];
    cout<<"请输入要申请磁盘(Disk)的数量:";        cin>>Num_R[1];
    cout<<"请输入要申请光驱(CDROM)的数量";        cin>>Num_R[2];
 
    system.AskResource(NumberP,Num_R,p0,p1,p2,p3,p4,system);
    cout<<"请输入你要哪个进程申请资源(0->p0;1->p1;2->p2;3->p3;4->p4;100->退出)";  cin>>NumberP; 
 }
    

 cout<<"你已经选择退出!"<<endl;

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?