调度算法

我的个人博客是wenjingliu.com,主要文章也都是写在个人博客上的,主要是用来保存一些图片比较方便.

算来好多天没写博客,有客观的原因也有主观的原因,最近还是在看现代操作系统,看的挺慢,今天想写的是关于操作系统中的进程调度算法

  • 先介绍一些基本知识,我们先给调度算法分三类,之所以要分类的原因是不同的环境有不同的目标进而也需要不同的调度算法.这里划分出以下三种:

    • 批处理
    • 交互式
    • 实时

    批处理系统在商业领域应用非常广泛,交互式用户环境的一个例子就是我们常用的终端,当然服务器也归于此类.最后是实时系统,其与交互式系统的区别在于实时系统只运行那些用来推进现有应用的程序,而交互式系统是通用的,它可以运行任意的非协作甚至是有恶意的程序.

  • 调度算法的目标:
    在不同系统中有不同的要求,下表列出了一些目标:


    调度算法_第1张图片
    image.png

    下面简单介绍下评价不同调度算法的几个准则:

    1. cpu利用率:cpu是计算机系统中最重要的昂贵的资源,所以应该尽可能使cpu保持工作状态;
    2. 系统吞吐量:单位时间内cpu完成作业的数量,长作业需要消耗较长的处理机时间,所以会降低系统的吞吐量;
    3. 周转时间:从作业提交到作业完成所经历的时间,包括作业等待、在就绪队列中排队、在处理机上运行以及进行输入输出操作所花费时间的总和
      • 周转时间=作业完成时间-作业提交时间
      • 平均周转时间=(作业1的周转时间+作业2的周转时间+…+作业n的周转时间)/n
      • 带权周转时间=周转时间/作业实际运行时间
      • 平均带权周转时间=(作业1的带权周转时间+…+作业n的带权周转时间)/n
    4. 等待时间:是指进程处于等处理机状态时间之和,等待时间越长,用户满意度越低。处理机调度算法实际上并不影响作业执行或输入/输出操作的时间,只影响作业在就绪队列中等待所花的时间。因此,衡量一个调度算法优劣常常只需简单地考察等待时间
    5. 响应时间:是指从用户提交请求到系统首次产生响应所用的时间。在交互式系统中,周转时间不可能是最好的评价准则,一般釆用响应时间作为衡量调度算法的重要准则之一。从用户角度看,调度策略应尽量降低响应时间,使响应时间处在用户能接受的范围之内。

下面开始介绍我们今天要讲的主角,操作系统中常用的几种调度算法:

  • 批处理系统

    1. 先来先服务
      这个算法的名字就说明了它的思路,也就是根据进程请求CPU的顺序来使用CPU,进程将会一直占用CPU直到完成或者因为某种原因而阻塞才放弃CPU.这个算法易于理解也易于实现,也是相对公平的,当然这个算法也有很明显的效率缺陷,如果一个长作业先到达系统,后面的很多短作业都会等待很久,导致平均等待时间大大增加.
    2. 最短作业优先
      这个算法的前提是我们知道所有进程需要的运行时间.我们假设有四个作业,其运行时间分别为a,b,c,d.第一个作业在时间a结束,...,第四个在a+b+c+d时间结束.故平均周转时间为(4a+3b+2c+d)/4.显然,从数学的角度来看,a对平均周转时间的影响最大,b,c,d其次,所以最短作业优先算法的平均周转时间最短.
      值得一提的是,只有在所有作业都是可同时运行情况下,最短作业优先算法才是最优的.举个反例,考虑5个作业,A到E,运行时间为2,4,1,1,1,到达时间为0,0,3,3,3.开始只能运行A或B,因为其他三个作业还没到达.但是如果我们按照A-E的顺序运行,平均等待时间为4.6分钟,但是如果按照B-E,A的顺序运行作业,其平均等待时间为4.4分钟.(实际上不难理解)
    3. 最短剩余时间优先
      这是最短作业优先的抢占式版本.同上,必须掌握运行时间.当一个新进程到达时,其整个时间同当前进程的剩余时间做比较,如果新的进程比当前运行进程需要更少的时间,当前进程就被挂起,而运行新的进程.这种方式可以使新的短作业获得良好的服务.
  • 交互式系统

    1. 轮转算法
      每个进程被分配一个时间段,称为时间片,即允许进程在该时间段中运行,如果在时间片结束时进程还在运行,则将剥夺CPU并分配给另一个进程.如果进程在该时间片结束前堵塞或结束,则CPU立即进行切换.
      值得注意的是时间片长度的选择,如果太短的话,进程切换浪费的时间在有限的时间片中占用太大的比例将会导致效率很低.而如果太长的话,将会导致对短的交互请求的响应时间过长,将时间片设为20-50ms是个比较好的折中.
    2. 优先级调度
      基本思想很简单:每个进程被赋予一个优先级,允许优先级高的可运行进程先运行.不过需要注意的是运行时需要对优先级做出动态的调整或者对进程运行时间进行限制,避免低优先级进程被饿死的现象发生.
      另外,运行次序也可以由系统动态确定.例如,有些进程为I/O密集型,其多数时间用来等待I/O结束.当这样的进程需要CPU时,应立即分配给他CPU,以便启动下一个I/O请求,这样就可以在另一个进程计算的同时执行I/O操作.使I/O密集型进程获得较好服务的一种简单算法是将其优先级设为1/f,f为该进程在上个时间片中所占的部分.一个在其50ms的时间片中只使用1ms的进程将获得优先级50,而在阻塞之前用掉25ms的进程将会具有优先级2.
    3. 多级队列
      思路大概如下:先设立优先级类.属于最高优先级类的进程运行一个时间片,属于次高优先级类的进程运行2个时间片,再次一级运行4个时间片,以此类推.当一个进程用完分配的时间片后,它被移到下一类.这算法的优点在于减少了交换次数(因为分配的时间片是指数增加的),同时由于随着进程运行,优先级不断降低,运行帧度逐渐放慢,从而为短的交互进程让出进程.
    4. 最短进程优先
      这里主要说的是一个老化算法,该算法根据进程过去的行为进行推测,并估计运行时间最短的那个.假设某个终端上每条命令的估计运行时间为T0.现在假设测量到其下次运行时间为T1.可以用这个两个值的加权和来改进估计时间,即aT0+(1-a)T1.通过选择a的值,可以决定是尽快忘掉老的运行时间,还是在一段长时间内始终记住它们.当a=0.5时,可以得到以下序列:T0,T0/2+T1/2,T0/4+T1/4+T2/2,T0/8+T1/8+T2/4+T3/2
      可以看到三轮过后,T0在新的估计值中所占比重下降到1/8.
    5. 保证调度
      意思是保证n个用户,每个都能分到CPU时间的1/n.类似的,在一个有n个进程运行的单用户系统中,如果每个进程都等价,则每个进程都将获得1/n的CPU时间.为了实现保证,系统必须跟踪各个进程自从创建以来已使用的CPU时间.然后它计算各个进程应该获得CPU时间.很容易计算处真正获得的CPU时间和应该获得的CPU时间之比.算法会转向比率最低的进程,直到该进程的比率超过它最接近的竞争者为止.
    6. 彩票调度
      相当于系统给各个进程发彩票,然后抽奖,抽到谁谁就能获得CPU运行时间,在这里,很显然拥有最多彩票的进程会获得最多的CPU运行时间,也就是说拥有彩票f份额的进程大约能得到系统资源的f份额.另外,彩票调度可以用来解决一个其他方法很难解决的问题.一个例子是,有一个视频服务器,该服务器上的若干进程正在向其客户提供视频流,假设这些进程需要的帧流速为10,20,25/s.如果给这些进程分配10,20,25张彩票,那么他们会自动的按照大致正确的比例(及10:20:25)划分CPU使用.
    7. 公平分享调度
      这里的公平是针对与系统上登录的每个用户的,而不再是针对进程,这个算法保证每个用户都能得到相应的CPU份额而不管这个用户所拥有的进程数量多少.
  • 实时系统调度
    实时系统通常可以分为硬实时软实时,前者的含义是必须满足绝对的截止时间,后者的含义是虽然不希望偶尔错失截止时间,但是可以忍受,
    实时系统中的事件可以按照响应方式进一步分类为周期性事件或非周期性事件(发生时间不可预知).一个系统可能要响应多个周期性事件流.根据每个事件需要处理时间的长短,系统甚至可能无法处理完所有的时间.例如,如果有m个周期事件,事件i以周期Pi发生,并需要Ci秒CPU时间来处理一个事件,那么可以处理的负载条件是

    image.png

    满足这个条件的实时系统称为是可调度的.

结语:写到这里,这篇博客就差不多了,操作系统这一块需要记忆的地方很多,很多地方个人感觉思路不是很难,但是应用到实际中会出现或多或少的问题,这也告诉我们有时候想起来很简单的事情,在实际应用到实现上并不简单,甚至效果很差.

你可能感兴趣的:(调度算法)