资源分配之银行家算法(含随机调度算法C++代码,此银行家算法,没考虑死锁的发生)

来源:互联网 发布:centos 6.5mysql 编辑:程序博客网 时间:2024/05/02 02:19


#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
const int TASK_RUNNING=0;
const int TASK_SUCCEED=1;
const int TASK_WAITTING=2;
const int RLength=10;
int Rcs_left =RLength;
ofstream ff("result.txt");
class pcb
{
public:
 int p_pid;
 int p_stat;
 int p_apply;
 int p_occupy;
 bool p_issuc;
 int p_require;
 pcb(int id,int require)
 {
  p_pid=id;
  p_require=require;
  p_stat=TASK_RUNNING;
  p_occupy=0;
  p_issuc=false;
  p_apply=0;
 }
 friend ostream&operator<<(ostream&cout,const pcb&p)
 {

cout<<p.p_pid<<'/t'<<p.p_stat<<'/t'<<p.p_require<<'/t'<<p.p_occupy<<endl;
  return cout;
 }
};
void rand (vector<int>&resource,vector<pcb>&pgrp);
void banker(vector<int>&resource,vector<pcb>&pgrp);
int main()
{
 vector<int>resource;
 vector<pcb> pgrp;

 

 cout<<"请输入请求资源的最大申请量:"<<endl;
 cout <<"进程号/t 最大申请量"<<endl;
 ff<<"请输入请求资源的最大申请量"<<endl;
 ff<<"进程号/t 最大申请量"<<endl;
 int qty;
 for (int i(1);i<=4;i++)
 {
  do
  {
   cout<< i<<'/t';
   ff<<i<<'/t';
   cin>>qty;
   ff<<qty<<endl;
  }while(qty>Rcs_left||qty< 1);
  pgrp.  insert(pgrp.begin(),pcb(i,qty));
 }
 //输入各进程申请的资源总量,以及初始化各个过程;
 cout <<"算法选择:"<<'/t'<<"随机算法(R)"<<'/t'<<"银行家算法(B)"<<"       (按其他任意键退出)"<<endl;
     ff<<"算法选择:"<<'/t'<<"随机算法(R)"<<'/t'<<"银行家算法(B)"<<"       (按其他任意键退出)"<<endl;
 char choice;
 cin>>choice;
 ff<<choice<<endl;
 if (choice=='R'||choice=='r')
  rand(resource,pgrp);
 else if (choice=='B'||choice=='b')
  banker(resource,pgrp);
 else
  return (0);
 return(1);
}
void rand (vector<int>&resource,vector<pcb>&pgrp)
{
 vector<pcb>::iterator p,q;
 vector<pcb>::iterator current;
 int temp;
 cout<<"现在进行的是————随机算法"<<endl;
 ff<<"现在进行的是————随机算法"<<endl;
 for(; ;)
 {
  //select a TASK_RUNNIU process,maybe different from the former one;
  for(p=pgrp.begin();p!=pgrp.end();p++)
        {
     if(p->p_stat==TASK_RUNNING)
   {
    current=p;
    break;
   }
  }
  if (current->p_apply==0)
  {
   cout<<"请输入该进程的当前申请量/n"<<current->p_pid<<'/t';
   ff<<"请输入该进程的当前申请量/n"<<current->p_pid<<'/t';
   cin>>temp;
   ff<<temp<<endl;
   while (temp>p->p_require-p->p_occupy)
   {
    cout<<"申请量超过实际需求量!"<<endl;
    cout<<"请输入该进程的当前申请量/n"<<current->p_pid<<'/t';
    ff<<"申请量超过实际需求量!"<<endl;
    ff<<"请输入该进程的当前申请量/n"<<current->p_pid<<'/t';
      cin>>temp;
    ff<<temp<<endl;
   }
   p->p_apply=temp;
  }
   // input the apply for the current process;
   if (current->p_apply>Rcs_left)
   { //has problem
     //apply too much ,please wait……
     current->p_stat=TASK_WAITTING;
     cout<<endl<<"资源不足,进程"<<current->p_pid<<" 等待分配/n";
     ff<<endl<<"资源不足,进程"<<current->p_pid<<" 等待分配/n";
     for(p=pgrp.begin();p!=pgrp.end();p++)
     {
      if (p->p_stat==TASK_RUNNING)    break;
     }
     if (p==pgrp.end())
     {   cout<<"死锁!!!"<<endl;
      ff<<"死锁!!!"<<endl;
      exit(1);
     }
     continue;
  }
            resource.insert(resource.begin(),current->p_apply,current->p_pid);
   cout<<temp<<"个资源分配给进程"<<p->p_pid<<endl;
   cout<<endl;
   ff<<temp<<"个将资源分配给进程"<<p->p_pid<<endl;
   ff<<endl;
   Rcs_left-=current->p_apply;
   current->p_occupy+=current-> p_apply;
   current->p_apply=0;
   if (current->p_occupy<current->p_require)
   {
    pcb proc(*current);
    pgrp.erase(current);
    pgrp.insert(pgrp.end(),proc);
    //current->p_apply=0;
    //delete current and insert into the end
    continue;//go on and should select another process
   }
   // succeed
   cout<<endl<<"进程/t"<<p->p_pid<<"/t成功完成分配!!"<<endl;
   ff<<endl<<"进程/t"<<p->p_pid<<"/t成功完成分配!!"<<endl;
   Rcs_left+=current->p_occupy;
   resource.clear();
   current->p_stat=TASK_SUCCEED;
   //current->p_apply=0;
   for (p=pgrp.begin();p!=pgrp.end();p++)
   {
    if (p->p_stat==TASK_WAITTING)
     break;
   }
   if (p==pgrp.end())
   {
    for (q=pgrp.begin();q!=pgrp.end();q++)
    {
     if (q->p_stat==TASK_RUNNING)
      break;
    }
    if (q==pgrp.end())
    {
     cout<<"该进程分配成功完成!!"<<endl;
     ff<<"该进程分配成功完成!!"<<endl;
     exit(0);
    }
    else continue;
    //There is a process in the queue;
   }
   for (p=pgrp.begin();p!=pgrp.end();p++)
   {
    if (p->p_stat==TASK_WAITTING&&Rcs_left>=p->p_apply)
     break;
   }
   if (p!=pgrp.end())
   {
    p->p_stat=TASK_RUNNING;
    pcb proc(*p);
    pgrp.erase(p);
    pgrp.insert(pgrp.end(),proc);
    continue;
   }
   else
   {
    cout<<"可能出现死锁!!!"<<endl;
    ff<<"可能出现死锁!!!"<<endl;
    exit(1);
   }
 }
}
void banker(vector<int>&resource,vector<pcb>&pgrp)
{

 vector<pcb>::iterator p;
 
 vector<pcb>::iterator current ,q;
pcb proc(0,0);
int length;
cout<<"现在进行————银行家算法"<<endl;
ff<<"现在进行————银行家算法"<<endl;
for (; ;)
{
    for(p=pgrp.begin();p!=pgrp.end();p++)
    {
     if (p->p_stat==TASK_RUNNING)
     {
      current=p;
      break;
     }
    }
   if (current->p_apply==0)
    {
     cout<<"请输入该进程的当前申请量/n"<<current->p_pid<<'/t';
     ff<<"请输入该进程的当前申请量/n"<<current->p_pid<<'/t';
     cin>>current->p_apply;
     ff<<current->p_apply<<endl;
     while (current->p_apply>current->p_require-current->p_occupy)
     {
      cout<<cout<<"请输入该进程的当前申请量/n"<<current->p_pid<<'/t';
      ff<<cout<<"请输入该进程的当前申请量/n"<<current->p_pid<<'/t';
      cin>>current->p_apply;
      ff<<current->p_apply<<endl;
     }
    }
   if (current->p_apply>Rcs_left)
    {
     current->p_stat=TASK_WAITTING;
     proc=*current;
     pgrp.erase(current);
     pgrp.insert(pgrp.end(),proc);
     cout<<endl<<"进程"<<p->p_pid<<"进入等待状态!"<<endl;
     ff<<endl<<"进程"<<p->p_pid<<"进入等待状态!"<<endl;
     continue;
    }
    pcb backup(*current);
    length=Rcs_left;
    current->p_occupy+=current->p_apply;
    length-=current->p_apply;
    if (current->p_occupy==current->p_require)
     length+=current->p_require;
    current->p_issuc=true;

    for (p=pgrp.begin();p!=pgrp.end();p++)
    {
     if (p->p_stat==TASK_SUCCEED) continue;
     if (p==current&&p->p_issuc==true)
      continue;
     if ((p->p_require-p->p_occupy)>length)  continue;
       else
       {
      p->p_issuc=true;
      length+=p->p_occupy;
      continue;
     }
    }
    for (p=pgrp.begin();p!=pgrp.end();p++)
    {
     if (p->p_issuc==false&&p->p_stat!=TASK_SUCCEED)break;
    }
    if (p!=pgrp.end())
    {
     current->p_occupy=backup.p_occupy;
     current->p_stat=TASK_WAITTING;
     cout<<endl<<"让进程"<<current->p_pid<<"等待分配."<<endl;
     ff<<endl<<"让进程"<<current->p_pid<<"等待分配."<<endl;
     proc=*current;
     pgrp.erase(current);
     pgrp.insert(pgrp.end(),proc);
     for (p=pgrp.begin();p!=pgrp.end();p++)
      p->p_issuc=false;
     continue;
    }
    resource.insert(resource.end(),current->p_apply,current->p_pid);
    Rcs_left-=current->p_apply;
    cout<<endl<<"进程"<<current->p_pid<<"获准得到请求的"<<current->p_apply<<"个资源"<<endl;
    ff<<endl<<"进程"<<current->p_pid<<"获准得到请求的"<<current->p_apply<<"个资源"<<endl;
    current->p_apply=0;
   if (current->p_occupy<current->p_require)
    {
     proc=*current;
     pgrp.erase(current);
     pgrp.insert(pgrp.end(),proc);
     for(p=pgrp.begin();p!=pgrp.end();p++)
      p->p_issuc=false;
         continue;
    }
    current->p_stat=TASK_SUCCEED;
    current->p_occupy=0;
    cout<<"进程"<<current->p_pid<<"已经运行结束!!!"<<endl;
    ff<<"进程"<<current->p_pid<<"已经运行结束!!!"<<endl;
    resource.clear();
    Rcs_left+=current->p_require;
    for(p=pgrp.begin();p!=pgrp.end();p++)
    {
     if (p->p_stat==TASK_WAITTING)
      break;
    }
    if (p==pgrp.end())
    {
     for(q=pgrp.begin();q!=pgrp.end();q++)
     {
      if (q->p_stat==TASK_RUNNING)
       break;
     }
    if (q==pgrp.end())
     {
      cout<<endl<<"该进程分配成功完成!!"<<endl;
      ff<<endl<<"该进程分配成功完成!!"<<endl;
      exit(0);
     }
     else
      continue;
    }
    proc=*p;
    pgrp.erase(p);
    pgrp.insert(pgrp.end(),proc);
    p->p_stat=TASK_RUNNING;
    continue;
   }

原创粉丝点击