模拟进程调度

来源:互联网 发布:m37560efgp数据手册 编辑:程序博客网 时间:2024/05/21 22:48

/***************************************************
 进程的调度算法
 1.FCFS
 2.SJF
 3.RR

 t=等待+运行=完成-到达
 w=t/运行

    2007/6/26
      Made by LG

***************************************************/

#include "iostream"
#include "ctime"
#include "vector"
#include "string"
using namespace std;
typedef struct node
{
 int name;
 time_t arrive;
 time_t run;
 float ping;
 float quan;
 struct node *next;
}PCB;
long ot=-1;
float p_ping;
float p_quan;
PCB *init(int num)
{
 time_t t;
 PCB *head=new PCB;
 PCB *s;
 char ch[2];
 PCB *r=new PCB;
 cin.getline(ch,1,'/n');
 cout<<"进程名将以顺序命名."<<endl;
 time(&t);
 srand(t);
 for(int i=0;i<num;++i)
 {
  cin.getline(ch,1,'/n');
  if(ch[0]==NULL)
  {
   time(&t);
   s=new PCB;
   s->name=i;
   if(ot==-1)
   {
    ot=t;
   }
   s->arrive=t-ot;
  
   s->run=rand()%20+1;
   s->ping=0;
   s->quan=0;

   if(i==0)
   {
    head->next=s;
    r->next=s;
    r=s;
   }

   else
   {
    r->next=s;
    r=s;
   }
  }
 }

 r->next=NULL;
 r=NULL;
 s=NULL;
 delete s;
 delete r;
 return head;
}

void ismostlong(vector<PCB>::iterator iter,vector<PCB>& v1,vector<PCB>::iterator& answer,long tt)
{
 vector<PCB>::iterator t;
 t=v1.begin()+1;
 long ts;
 vector<PCB>::iterator most;
 most=NULL;
 ts=1000;
// tt=iter->arrive+iter->run;

 for(;t!=v1.end();t++)
 {
  if(t->arrive>=0 && t->arrive<=tt)
  {
   if(ts>t->run)
   {
    most=t;
    ts=most->run;
//    break;
   }
  }
 }
 
 answer=most;
}


int main(void)
{
 int jjhhgg;
 PCB *head;
 cout<<"要创建多少进程:";
 cin>>jjhhgg;

 head=init(jjhhgg);
 PCB *temp=head->next;
 vector<PCB> v1;
 while(temp)
 {
  cout<<temp->name<<'/t'<<temp->arrive<<'/t'<<temp->run<<endl;
  v1.push_back(*temp);
  temp=temp->next;
 }
 cout<<"选择你要使用的调度算法。"<<endl;
 cout<<"1.FCFS"<<endl;
 cout<<"2.SJF"<<endl;
 cout<<"3.RR"<<endl;
 int choose;
 cin>>choose;
 
 if(choose==1)     //完成
 {
  cout<<"执行顺序为:"<<endl;
  int m=0;
  vector<PCB>::iterator iter;
  iter=v1.begin();
  int wait=0;
  while(iter!=v1.end())
  {
   cout<<iter->name<<"  ";
   iter->ping=wait+iter->run;
   iter->quan=(float)(iter->ping/iter->run);
   wait+=iter->run;
   p_ping+=iter->ping;
   p_quan+=iter->quan;
   iter++;
  }

  cout<<endl;

  cout<<"周转时间"<<'/t'<<"带权周转"<<'/t'<<"平均周转"<<'/t'<<"平均带权"<<endl;
  for(iter=v1.begin();iter!=v1.end();++iter)
  {
   cout<<iter->ping<<'/t'<<'/t'<<iter->quan<<'/t'<<'/t'<<p_ping/jjhhgg<<'/t'<<'/t'<<p_quan/jjhhgg<<endl;
  }

  cout<<endl;
 }

 else if(choose==2)
 { 
  long tim;
  int wait=0; 
  vector<PCB> peihe;
  vector<PCB>::iterator iter;
  vector<PCB>::iterator answer;
  iter=v1.begin(); 
  cout<<"执行顺序为:"<<endl;

  iter->ping=iter->run;
  iter->quan=iter->ping/iter->run;
  cout<<iter->name<<"  ";


    //等待时间
  tim=iter->arrive+iter->run;
  peihe.push_back(*iter);
  wait=iter->run;
  iter++;
  
  int us=0;

 

  for(;iter;iter++)
  { 
  
   if(us==jjhhgg-1)
    break;
   ismostlong(iter,v1,answer,tim);
   
   cout<<answer->name<<"  ";
   tim+=answer->run;
   answer->ping=wait+answer->run;
   answer->quan=answer->ping/answer->run;
   wait+=answer->run;
   p_ping+=answer->ping;
   p_quan+=answer->quan;
   peihe.push_back(*answer);


   us++;
   answer->arrive=-1;
  }
  
  cout<<endl;

  cout<<"周转时间"<<'/t'<<"带权周转"<<'/t'<<"平均周转"<<'/t'<<"平均带权"<<endl;
  for(iter=peihe.begin();iter!=peihe.end();++iter)
  {
   cout<<iter->ping<<'/t'<<'/t'<<iter->quan<<'/t'<<'/t'<<p_ping/jjhhgg<<'/t'<<'/t'<<p_quan/jjhhgg<<endl;
  }

  cout<<endl;
  cout<<endl;
 }

 else if(choose==3)      //完成
 {
  vector<PCB>::iterator iter;
  iter=v1.begin();
  int size;
  cout<<"输入时间片大小:";
  cin>>size;
  cout<<"执行顺序为:"<<endl;
  long now=iter->arrive;
  int tol=0;
  int kk;
  int wait=0;

  vector<int> v2;
  vector<int>::iterator i;
  int ss;
  for(iter=v1.begin();iter!=v1.end();++iter)
  {
   ss=iter->run;
   v2.push_back(ss);
  }
  iter=v1.begin();
     
  while(true)
  {
   int ut=0,t;    //防止运行时间少于周转时间情况的等待时间出错
   if(iter->arrive<=now && iter->run>0)
   {
    t=iter->run;
    kk=size;
    while(kk>0)
    {
     kk--;
     cout<<iter->name;
     iter->run--;
     iter->ping=++wait;
     
          
     if(iter->run==0)
     {
      ut=1;
      break;
     }
    }
    if(ut==0)
     now+=size;
    else
     now+=t;
   }

   if(iter->run<=0)
   {
    if(iter->name>=0)
    {
     iter->name=-1;
     tol++;
    }
    else
    {}
   }

   if(iter->next==NULL)
   {
    iter=v1.begin();
   }
   else
    iter++; 

   if(tol==jjhhgg)
    break;
  }

  cout<<endl;

  i=v2.begin();
  for(iter=v1.begin();iter!=v1.end();++iter)
  {
   iter->quan=iter->ping/(*i);
   i++;
   p_ping+=iter->ping;
   p_quan+=iter->quan;
  }
//  p_ping/=jjhhgg;
//  p_quan/=jjhhgg;

  cout<<"周转时间"<<'/t'<<"带权周转"<<'/t'<<"平均周转"<<'/t'<<"平均带权"<<endl;
  for(iter=v1.begin();iter!=v1.end();++iter)
  {
   cout<<iter->ping<<'/t'<<'/t'<<iter->quan<<'/t'<<'/t'<<p_ping/jjhhgg<<'/t'<<'/t'<<p_quan/jjhhgg<<endl;
  }

  cout<<endl;
 }
 

 return 0;

原创粉丝点击