进程调度模拟算法

/**进程调度算法

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;

        

       }

       }

}

 

进程调度算法模拟。通过对进程调度算法模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。 (1) 用C、C++、Java语言编程实现对5个进程采用动态优先权调度算法进行调度的过程。数据如下: 5个进程的到达时刻和服务时间见下表,忽略I/O以及其它开销时间,使用动态优先权算法进行调度,优先权初始值为100,请输出各个进程的完成时刻、周转时间、带权周转时间。 进程 到达时刻 服务时间 A 0 3 B 2 6 C 4 4 D 6 5 E 8 2 (2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段(用不到的字段可以不定义)。  进程标识数ID。  进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。  进程已占用CPU时间CPUTIME。  进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。  进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。  进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。  进程状态STATE。  队列指针NEXT,用来将PCB排成队列。 (3)优先数改变的原则:  进程在就绪队列中呆一个时间片,优先数增加1。  进程每运行一个时间片,优先数减3。 (4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。 (5)分析程序运行的结果,谈一下自己的认识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值