操作系统中常见的进程调度算法

来源:互联网 发布:臭臭ddos软件 编辑:程序博客网 时间:2024/05/21 12:43

一 调度算法的含义:

      根据系统的资源分配策略所规定的资源分配算法。

          用户要求:响应时间

                            周转时间

                            截至时间

         系统要求:系统吞吐量

                           处理器利用率

                           各类资源的平衡使用

                           公平性及优先级

二 目前比较常见的几种计算机系统调度方法及其框图:

        1,先到先服务

       2,短进程优先算法

       3, 高响应比优先算法

       4 ,时间片轮转算

                                                                                  

                                                 

                                                         

三  各种相应算法的优缺点:

先到先服务优先级算法的优缺点:

   算法总是把处理机分配给最先进入就绪队列的进程,一个进程一旦分得处理机,便一直执行下去,直到该进程完成或阻塞时,才释放处理机。它是一种最简单的调度算法,适用于CPU繁忙型进程,而不利于I/O繁忙型进程(未能有效利用系统资源)。

短进程优先级算法的优缺点:

      短进程优先级调度算法,是指对短进程优先调度的算法。他们可以分别用于作业调度和进程调度,短作业优先的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将他们调入内存运行。而短进程优先调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给他,,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再度重新调度。非抢占式这种方式是 一旦把处理机分配给某进程后,便让该进程一直执行,直至该进程完成或发生某事件而被阻塞时,才再把处理机分配给其它进程,决不允许某进程抢占已经分配出去的处理机。这种调度方式的优点是实现简单,系统开销小,适用于大多数的批处理系统环境。但它难以满足紧急任务的要求——立即执行,因而可能造成难以预料的后果。因此,在要求比较严格的实时系统中,不宜采用这种调度方式。

时间片轮转算法的优缺点:

     每次调度,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,由一个计时器发出一个时钟中断请求,该进程被停止,并送往就绪队列末尾;依次循环。从终端用户来看:感觉自己独占一台主机,不受其他用户的影响。但程序切换将增加系统的额外开销。

高响应比优先级算法的优缺点:

      高响应比优先法调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。  响应比R定义如下:  R=(W+T)/T=1+W/T  其中T为该作业估计需要的执行时间,W为作业在后备状态队列中的等待时间。  每当要进行作业调度时,系统计算每个作业的响应比,选择其中R最大者投入执行。这样,即使是长作业,随着它等待时间的增加,W/T也就随着增加,也就有机会获得调度执行,但由于每次调度前要计算响应比,系统开销也要相应增加。

四  代码实现:

定义结构体

  struct Pro

 {

    int num;                 //进程号 

    int time_in;             //进程到达时间 

    int work_time;        //进程服务时间  
    int btime;               //用于抢占式进程优先记录该进程开始时间   

    int l_w_time;         //用于抢占式进程优先记录剩余服务时间   

    int end_time;        //记录该进程结束时间,(需要时时监测) 

    int judge;             //用于需要时的标记  
 }pro[10];                 //进程结构体 


先到先服务:

  void FCFS() //先到先服务

 { 

   char s[] = {"先到先服务"};  

   printmat(s);   

   PT; 

   int i, j;  

   int min;

   int t = pro_num; 
   int begin_time = 0x7fff; 

   for(i = 1; i <= pro_num; i++)  

  {     

        if(pro[i].time_in < begin_time)     

        begin_time = pro[i].time_in; 

        pro[i].judge = 0;  //所有进程号查找标志置0,表示还未查找 

  }  
        while(t--) 

            { 
                 for(i = 1; i <= pro_num; i++)  

                    { 
                             if(pro[i].judge==0)      

                                 { 
                                     min = i; //设其为目前最早到达的时间             

                                      for(j = i+1; j <= pro_num; j++)         

                                           { 
                                      if(pro[j].judge == 0 && pro[j].time_in <= pro[min].time_in)//该进程号若还未被查找且小于预设 
                                     min = j;   

                                           } 
                                   
    pro[min].judge = 1; //该进程号被查找过   

                                        printf(Fomal2,pro[min].num,pro[min].time_in,pro[min].work_time,begin_time,

                                                 begin_time +pro[min].work_time,begin_time + pro[min].work_time-pro[min].time_in);

                                         begin_time += pro[min].work_time;          

                                          puts("");        

                                    }     

                  }  

         }  

     printmat(s); 

     puts(""); 

   }

运行结果:


0 0