Linux常见的进程调度算法

进程调度:在操做系统中调度是指一种资源分配。linux

调度算法是指: 根据系统的资源分配策略所规定的资源分配算法。算法

操做系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,由于资源的有限性,必须按照必定的原则选择进程(请求)来占用资源。这就是调度。目的是控制资源使用者的数量,选取资源使用者许可占用资源或占用资源。数据库

那么咱们看一下常见的进程调度算法:服务器

1.      先来先去服务:oop

概念:性能

若是早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,那么先来先服务(FCFS: first come first service)老是把当前处于就绪队列之首的那个进程调度到运行状态。也就说,它只考虑进程进入就绪队列的前后,而不考虑它的下一个CPU周期的长短及其余因素。优化

要领:ui

按照进程进入就绪队列的前后顺序调度并分配处理机执行。先来先服务调度算法是一种非抢占式的算法,先进入就绪队列的进程,先分配处理机运行。一旦一个进程占有了处理机,它就一直运行下去,直到该进程完成工做或者由于等待某事件发生而不能继续运行时才释放处理机。spa

(1)系统只要有按FIFO规则创建的后备做业队列或就绪进程队列便可,就是一个做业控制块JCB或进程控制块PCB加入队列时加在相应队列末尾。操作系统

(2)调度退出队列时从相应队列首开始顺序扫描,将相关的JCB或PCB调度移出相应队列。

流程图:

执行过程:

优势:有利于长做业以及CPU繁忙的做业

缺点:不利于短做业以及I/O繁忙的做业

 

2.      短做业(进程)优先调度算法SJ(P)F

概念:对预计执行时间短的做业(进程)优先分派处理机.一般后来的短做业不抢先正在执行的做业.

优势:

比FCFS改善平均周转时间和平均带权周转时间,缩短做业的等待时间;

提升系统的吞吐量;

缺点:

对长做业很是不利,可能长时间得不到执行;

未能依据做业的紧迫程度来划分执行的优先级;

难以准确估计做业(进程)的执行时间,从而影响调度性能。

流程图:

 

3.   轮转法

概念:让每一个进程在就绪队列中的等待时间与享受服务的时间成正比例。

定义:

时间片轮转法相似于“轮流坐庄”的思想,条件是:各做业近似认为“同时”到达,题中条件是后面做业依次比前一个做业迟到一个时间单位,分析时要严格按照RR调度算法的实现思想:系统把全部就绪进程按先入先出的原则排成一个队列。新来的进程加到就绪队列末尾。每当执行进程调度时,进程调度程序老是选出就绪队列的对首进程,让它在CPU上运行一个时间片的时间。当进程用完分给它的时间片后,调度程序便中止该进程的运行,并把它放入就绪队列的末尾。

流程图:

 

4.       多级反馈队列算法

概念:

设置多个就绪队列,分别赋予不一样的优先级,如逐级下降,队列1的优先级最高。每一个队列执行时间片的长度也不一样,规定优先级越低则时间片越长,如逐级加倍。

新进程进入内存后,先投入队列1的末尾,按FCFS算法调度;若按队列1一个时间片未能执行完,则下降投入到队列2的末尾,一样按FCFS算法调度;如此下去,下降到最后的队列,则按“时间片轮转”算法调度直到完成。

仅当较高优先级的队列为空,才调度较低优先级的队列中的进程执行。若是进程执行时有新进程进入较高优先级的队列,则抢先执行新进程,并把被抢先的进程投入原队列的末尾。

多级反馈队列调度算法又称反馈循环队列或多队列策略,主要思想是将就绪进程分为两级或多级,系统相应创建两个或多个就绪进程队列,较高优先级的队列通常分配给较短的时间片。处理器调度先从高级就绪进程队列中选取可占有处理器的进程,只有在选不到时,才从较低级的就绪进程队列中选取。

优势:

为提升系统吞吐量和缩短平均周转时间而照顾短进程。

为得到较好的I/O设备利用率和缩短响应时间而照顾I/O型进程。

没必要估计进程的执行时间,动态调节。

流程图:

 

几种算法的比较:

 

那么在个人linux下 采用什么进程调度算法?

咱们先看一下本身Linux的内核版本:

咱们的内核版本为 2.6

因此 咱们去查Linux 2.6进程调度算法

  在LINUX 2.6中,有四种关于IO的调度算法,下面综合小结一下: 1) NOOP NOOP算法的全写为No Operation。该算法实现了最最简单的FIFO队列,全部IO请求大体按照先来后到的顺序进行操做。之因此说“大体”,缘由是NOOP在FIFO的基础上还作了相邻IO请求的合并,并非完彻底全按照先进先出的规则知足IO请求。NOOP假定I/O请求由驱动程序或者设备作了优化或者重排了顺序(就像一个智能控制器完成的工做那样)。在有些SAN环境下,这个选择多是最好选择。Noop 对于 IO 不那么操心,对全部的 IO请求都用 FIFO 队列形式处理,默认认为 IO 不会存在性能问题。这也使得 CPU 也不用那么操心。固然,对于复杂一点的应用类型,使用这个调度器,用户本身就会很是操心。 2) Deadline scheduler   DEADLINE在CFQ的基础上,解决了IO请求饿死的极端状况。除了CFQ自己具备的IO排序队列以外,DEADLINE额外分别为读IO和写IO提供了FIFO队列。读FIFO队列的最大等待时间为500ms,写FIFO队列的最大等待时间为5s。FIFO队列内的IO请求优先级要比CFQ队列中的高,,而读FIFO队列的优先级又比写FIFO队列的优先级高。优先级能够表示以下: FIFO(Read) > FIFO(Write) > CFQ     deadline 算法保证对于既定的 IO 请求以最小的延迟时间,从这一点理解,对于 DSS 应用应该会是很适合的。 3) Anticipatory scheduler   CFQ和DEADLINE考虑的焦点在于知足零散IO请求上。对于连续的IO请求,好比顺序读,并无作优化。为了知足随机IO和顺序IO混合的场景,Linux还支持ANTICIPATORY调度算法。ANTICIPATORY的在DEADLINE的基础上,为每一个读IO都设置了6ms 的等待时间窗口。若是在这6ms内OS收到了相邻位置的读IO请求,就能够当即知足    Anticipatory scheduler(as) 曾经一度是 Linux 2.6 Kernel 的 IO scheduler 。Anticipatory 的中文含义是”预料的, 预想的”, 这个词的确揭示了这个算法的特色,简单的说,有个 IO 发生的时候,若是又有进程请求 IO 操做,则将产生一个默认的 6 毫秒猜想时间,猜想下一个 进程请求 IO 是要干什么的。这对于随即读取会形成比较大的延时,对数据库应用很糟糕,而对于 Web Server 等则会表现的不错。这个算法也能够简单理解为面向低速磁盘的,由于那个”猜想”实际上的目的是为了减小磁头移动时间。 4)CFQ   CFQ算法的全写为Completely Fair Queuing。该算法的特色是按照IO请求的地址进行排序,而不是按照先来后到的顺序来进行响应。    在传统的SAS盘上,磁盘寻道花去了绝大多数的IO响应时间。CFQ的出发点是对IO地址进行排序,以尽可能少的磁盘旋转次数来知足尽量多的IO请求。在CFQ算法下,SAS盘的吞吐量大大提升了。可是相比于NOOP的缺点是,先来的IO请求并不必定能被知足,可能会出现饿死的状况。    Completely Fair Queuing (cfq, 彻底公平队列) 在 2.6.18 取代了 Anticipatory scheduler 成为 Linux Kernel 默认的 IO scheduler 。cfq 对每一个进程维护一个 IO 队列,各个进程发来的 IO 请求会被 cfq 以轮循方式处理。也就是对每个 IO 请求都是公平的。这使得 cfq 很适合离散读的应用(eg: OLTP DB)。我所知道的企业级 Linux 发行版中,SuSE Linux 好像是最早默认用 cfq 的. 查看和修改IO调度器的算法很是简单。假设咱们要对sda进行操做,以下所示: cat /sys/block/sda/queue/scheduler echo “cfq” > /sys/block/sda/queue/scheduler 总结:   1 CFQ和DEADLINE考虑的焦点在于知足零散IO请求上。对于连续的IO请求,好比顺序读,并无作优化。为了知足随机IO和顺序IO混合的场景,Linux还支持ANTICIPATORY调度算法。ANTICIPATORY的在DEADLINE的基础上,为每一个读IO都设置了6ms的等待时间窗口。若是在这6ms内OS收到了相邻位置的读IO请求,就能够当即知足。 IO调度器算法的选择,既取决于硬件特征,也取决于应用场景。 在传统的SAS盘上,CFQ、DEADLINE、ANTICIPATORY都是不错的选择;对于专属的数据库服务器,DEADLINE的吞吐量和响应时间都表现良好。然而在新兴的固态硬盘好比SSD、Fusion IO上,最简单的NOOP反而多是最好的算法,由于其余三个算法的优化是基于缩短寻道时间的,而固态硬盘没有所谓的寻道时间且IO响应时间很是短。   2 对于数据库应用, Anticipatory Scheduler 的表现是最差的。Deadline 在 DSS 环境表现比 cfq 更好一点,而 cfq 综合来看表现更好一些。这也难怪 RHEL 4 默认的 IO 调度器设置为 cfq. 而 RHEL 4 比 RHEL 3,总体 IO 改进仍是不小的。