进程调度模拟算法

来源:互联网 发布:阿里云服务器推荐码 编辑:程序博客网 时间:2024/05/29 06:33

/**进程调度算法

1、先来先服务算法

2、短进程优先算法

**/

 

#include<cstdlib>

#include<iostream>

#include<iomanip>

 

using namespacestd;

 

 

//定义结构体,里面包含的有一个进程相关的信息

struct PCB{  

       char name[10];   

       float arrivetime;   

       float servicetime;   

       float starttime;   

       float finishtime;   

       float zztime;   

       float dqzztime;   

};  

 

PCB a[100]; 

 

/********************输入进程函数********************/ 

void input(PCB*p,int N)   

{

       int i;  

    cout<<endl;

       cout<<"请输入进程的        名字   到达时间   服务时间:  (例如: a 0 100)"<<endl;

        

       for(i=0;i<=N-1;i++)   

       {   

              cout<<"请输入进程"<<i+1<<"的信息";

              cin>>p[i].name;

              cin>>p[i].arrivetime;

              cin>>p[i].servicetime;             

       }   

  

/********************先来先服务算法********************/ 

 

//排序   

void sort_FCFS(PCB*p,int N)   

{   

     for(int i=0;i<=N-1;i++)   

         for(int j=0;j<=i;j++)   

            if(p[i].arrivetime<p[j].arrivetime)   

             {   

                 PCB temp;   

                 temp=p[i];   

                 p[i]=p[j];   

                 p[j]=temp;   

             }   

//运行     

void run_FCFS(PCB*p,int N)  

{

       int k;   

    for(k=0;k<=N-1;k++)   

     {   

         if(k==0)   

               {    

                      p[k].starttime=p[k].arrivetime;   

                      p[k].finishtime=p[k].arrivetime+p[k].servicetime;}   

  

         else  

               {   

                      p[k].starttime=p[k-1].finishtime;   

            p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}   

     }   

  

     for(k=0;k<=N-1;k++)   

     {   

               p[k].zztime=p[k].finishtime-p[k].arrivetime;   

               p[k].dqzztime=p[k].zztime/p[k].servicetime;   

        

     }   

}  

 

voidPrint_FCFS(PCB *p,int N)   

{

       int k; 

    cout<<"调用先来先服务算法以后进程运行的顺序是: ";

    cout<<p[0].name;  

       for(k=1;k<N;k++)   

       {

              cout<<"-->";

              cout<<p[k].name;  

       }  

     cout<<endl;

        cout<<"具体进程调度信息:"<<endl;

        cout<<"进程名  到达时间  服务时间  开始时间  结束时间  周转时间  带权周转时间"<<endl;

  

     for(k=0;k<=N-1;k++)   

     {

               cout<<setw(4)<< p[k].name

                      <<setw(8)<< p[k].arrivetime

                      <<setw(10)<< p[k].servicetime

                      <<setw(10)<< p[k].starttime

                      <<setw(10)<< p[k].finishtime

                      <<setw(10)<< p[k].zztime

                      <<setw(10)<<p[k].dqzztime<<endl;

               

     }     

 

}

//先来先服务算法   

void FCFS(PCB*p,int N)   

{   

     sort_FCFS(p,N);   

     run_FCFS(p,N);   

     Print_FCFS(p,N);

        int k;

        float Attime=0;

        float AQttime=0;

        for(k=0;k<=N-1;k++)   

     {  

               Attime+=p[k].zztime; 

               AQttime+=p[k].dqzztime;           

     } 

        Attime=Attime/N;

        AQttime=AQttime/N;

        cout<<"调用先来先服务算法的平均周转时间为: ";

        cout<<Attime<<endl;

        cout<<"调用先来先服务算法的平均带权周转时间为: ";

        cout<<AQttime<<endl;     

}  

 

 

/********************短进程优先算法********************/

 

//排序

void sort_SPF(PCB*p,int N)  

       /****按照到达时间排序****/

       for(int i=0;i<N-1;i++)  

              for(intj=i+1;j<=N-1;j++)  

                     if(p[i].arrivetime>p[j].arrivetime)  

             {  

                 PCB temp;  

                 temp=p[i];  

                 p[i]=p[j];  

                 p[j]=temp;  

             }

       for(int m=0;m<N-1;m++)      

       {

              if(m==0)  

                     p[m].finishtime=p[m].arrivetime+p[m].servicetime;  

         else 

           p[m].finishtime=p[m-1].finishtime+p[m].servicetime;

               

               /****查找当前进程执行过程中进入系统的进程****/

               int i=0;

         for(int n=m+1;n<=N-1;n++)  

               {

                      if(p[n].arrivetime<=p[m].finishtime)             

                             i++;  

               }  

               /****选择最短的为接下来执行的****/

               float min=p[m+1].servicetime;  

               int next=m+1;//m+1=n  

       

               for(int k=m+2;k<=m+i;k++)         

               {  

        

                      if(p[k].servicetime<min)  

                      {

                             min=p[k].servicetime;             

                             next=k;}                            

               }  

          

               PCB temp;              

               temp=p[m+1];             

               p[m+1]=p[next];             

               p[next]=temp;          

       }   

}  

 

//运行

void run_SPF(PCB*p,int N)

{

       int k;

    for(k=0;k<=N-1;k++)

     {

              if(k==0)

              {

                     p[k].starttime=p[k].arrivetime;

                     p[k].finishtime=p[k].arrivetime+p[k].servicetime;

              }

              else

              {

                     p[k].starttime=p[k-1].finishtime;

            p[k].finishtime=p[k-1].finishtime+p[k].servicetime;

              }

       }

       for(k=0;k<=N-1;k++)   

       {   

 

              p[k].zztime=p[k].finishtime-p[k].arrivetime;   

              p[k].dqzztime=p[k].zztime/p[k].servicetime;   

       }   

}

 

//显示结果

void Print_SPF(PCB*p,int N)

{

     int k;

        cout<<"调用最短进程优先调度算法以后进程的调度顺序为: ";

        cout<<p[0].name;  

        for(k=1;k<N;k++)

        {

               cout<<"-->";

               cout<<p[k].name; 

        }

        cout<<endl;

        cout<<"具体进程调度信息:"<<endl;

        cout<<"进程名  到达时间  运行时间  开始时间  完成时间"<<endl;

 

     for(k=0;k<=N-1;k++)

     {                

               cout<<setw(4)<< p[k].name

                      <<setw(8)<< p[k].arrivetime

                      <<setw(10)<< p[k].servicetime

                      <<setw(10)<< p[k].starttime

                      <<setw(10)<< p[k].finishtime

                      <<endl;

      } 

}

 

//最短进程优先算法

void SPF(PCB*p,int N)

{

       sort_SPF(p,N);

       run_SPF(p,N);

       Print_SPF(p,N);

 

       int k;

       float Attime=0;

       float AQttime=0;

       for(k=0;k<=N-1;k++)   

       {  

              Attime+=p[k].zztime; 

              AQttime+=p[k].dqzztime;      

       } 

       Attime=Attime/N;

       AQttime=AQttime/N;

       cout<<"调用最短进程优先算法的平均周转时间为: ";

       cout<<Attime<<endl;

       cout<<"调用最短进程优先算法的平均带权周转时间为: ";

       cout<<AQttime<<endl;

          

}

 

/********************主函数选择算法********************/

int main(void)

{

       for(;;)

       {

              int N;  

              cout<<endl;                                      

              cout<<"输入进程数目:"<<endl;

              cin>>N;                           

              input(a,N);   

       char chose;

       cout<<"请选择进程调度方法"<<endl;

       cout<<"输入 f 或者 F 执行先来先服务算法:"<<endl;

       cout<<"输入 s 或者 S 执行先来先服务算法:"<<endl;

       cin>>chose;

       switch(chose)

       {

       case 'f':

       case 'F':

              cout<<endl;                                      

              cout<<"<<----------!!!@@@先来先服务调度算法@@@!!!---------->>"<<endl;                          

              cout<<endl;                                         

              FCFS(a,N);

              break;

 

                          

       case 's':                     

       case 'S':                  

              cout<<endl;                         

              cout<<"<<----------!!!@@@最短进程优先调度算法@@@!!!---------->>"<<endl;                           

              cout<<endl;                                                                    

              SPF(a,N);

              break;

        

       }

       }

}

 

原创粉丝点击