操作系统原理:调度算法和实时调度

         CPU 要选择什么进程去执行,什么时候去选择新的进程?同时要求CPU尽量地充分被利用。

调度算法评量指标包含:

CPU利用率:CPU处于忙状态的百分比,

吞吐量:单位时间内完成的进程数量,即带宽

周转时间:进程的启动到结束所需的时间,包含所有等待花费的时间,

等待时间:在就绪队列中的总时间

响应时间:请求发出到请求开始被处理的时间。 即延迟

目录

一、先来先服务算法  FCFS

二、短进程优先的调度算法(SPN /SJF/SRT)

三、最高相应比优先(HRRN)

扫描二维码关注公众号,回复: 13394630 查看本文章

四、轮询调度算法(Round Robin)

五、多级反馈队列 MLFQ

六、公平共享调度 FFS

七、实时调度

八、多处理器调度

九、优先级反转


一、先来先服务算法  FCFS

     哪一个进程先到,先完成哪个进程。这个算法的缺点是:如果先来的进程处理时间很长,那么其他进程的等待时间也会很长。这种方法没有一个进程优先级的概念,也没有”公平“的概念,因为对于后请求的进程等待时间会很长。

二、短进程优先的调度算法(SPN /SJF/SRT)

       处理时间短的先做完的算法。这样做的处理可能短进程请求源源不断地来造成长进程可能会很长时间都不会被执行。即长进程饥饿。还存在的问题时,CPU并不可以得知哪一个进程的执行时间更短。CPU只有在执行完成后,才知道进程请求的执行时间是多久。当然有种方法可以大致预估进程执行时间:通过之前的执行历史得到进程下个时刻的执行时间的预估。

三、最高相应比优先(HRRN)

         比SPN还考虑了进程的等待时间w,执行时间s。相应比   R =(w+s)/s。这种算法避免了所有进程的执行都被长时间延迟。关注了进程的等待时间,等待时间越长,相应比越高,越快被执行。当然这个算法还是要考虑如何知道进程的执行时间是多少。

四、轮询调度算法(Round Robin)

      给定一个时间片(示例是20ms),等待进程的轮流执行。给每个进程都有机会执行,达到公平效果。这个算法需要考虑时间片的设置,如果设置太短,那么上下文切换开销会变大,如果设置太大有可能退化成FCFS。 

       

五、多级反馈队列 MLFQ

      给定多个队列,每个队列有对应的优先级,必须高优先级的任务先完成,再完成低优先级的任务。此方法需要考虑的是给进程分级,由于每个进程在不同时段的优先级可能会变,是动态的。所以需要有一个反馈机制,使进程的优先级可以根据需要进行变化。MLFQ的做法是可以”交换“队列之间的优先级。通常IO任务希望先被CPU执行完,因为可以在等待IO的过程中使CPU能够去执行其他任务,从而充分利用IO和CPU。

六、公平共享调度 FFS

      它的理念是,希望从用户的角度去公平地调度,而不是从进程的角度。其中Linux 的调度策略就是在此基础上建立的。

七、实时调度

      实时调度所面向的系统不一样,它面对的是实时系统。通常实时系统经常应用于工厂,嵌入式等。任务完成的时间必须确保按时完成叫做硬实时系统,而任务完成的时间能够尽量确保按时完成,要求重要任务优先完成叫做软实时系统。例如水池加水任务,如果这个任务不能按照规定时间完成,可能会造成水池水溢出,造成严重后果,所以给水池做的自动化系统需要硬实时的。所以硬实时系统的算法一定需要验证是否满足一定可以按规定完成任务的要求。

  1)静态优先级调度

        给定在规定的时间,在这时间内完成相应的动作,例如 轮询调度算法(Round Robin)就是静态调度策略。

       对于实时系统来讲,有一种方法叫 速率单调调度 RM 算法: RM算法在任务执行之前就把任务优先级给确定了。之所以可以这样做是因为在实时系统中,任务的执行时间和执行周期一开始就可以确定。那么可以通过执行周期来设置任务的优先级。

  2)动态优先级调度

       在任务执行的过程中,任务的优先级会动态地变化,给定在不同的时间内的调度顺序会变化。如果任务距离DeadlLine的距离越短,那么任务优先级越高。

八、多处理器调度

      现如今的系统多核多处理器应用的占绝大多数。那么在多个CPU的情况下通过哪种方法处理一组任务效率更高呢?多CPU意味这可以并行执行,如何让所有CPU尽量都忙呢?

九、优先级反转

   例如下例,优先级从高到低的任务 T1,T2,T3,其中蓝色部分代表共享资源,共享资源只能被一个进程所访问。正常情况下应T1,T2,T3.顺序完成,刚开始T3进程先发出请求率先执行,在T3访问共享资源时优先级最高的T1发来请求,使CPU必须先执行T1。在t4时刻,T1尝试访问共享资源发现共享资源被其他进程给锁了,从而让T1进程变成阻塞状态,之后T3继续执行。当执行到t5时,比T3优先级高的T2发来请求,CPU完成了T2任务后,T3获取CPU的使用权限,完成完共享资源的访问。此时T1从阻塞态变成就绪态,获取CPU使用权。最后完成的顺序是T2,T3,T1。并不满足优先级高先执行的原则。这个现象称之为优先级反转。 

解决优先级反转现象的方法可以用优先级继承算法:此算法的原理是当T1发现T3进程抢占了自己所需要的资源后,让T3的优先级提升至和T1一致,让T3访问完共享资源后,再给T1访问。

也有种方法叫优先级天花板算法,由操作系统统计某个时间段由哪个共享资源会被不同优先级的任务来访问。给共享资源设置一个动态的优先级,必须比该优先级高或者相等的进程访问完后才再次调整共享资源的优先级。

猜你喜欢

转载自blog.csdn.net/superSmart_Dong/article/details/116611045