现在操作系统大多都是应用多时多任务系统。这一般就涉及进程调度。下面介绍几种常见的调度算法。

先进先出算法(FIFO)

算法总是把CPU分配给最先请求的进程。这种策略可以轻易用FIFO的队列来实现。

采用FCFS平均等待时间很长。


最短作业优先算法(SJF)

最短CPU运行期优先调度算法
该算法从就绪队列中选出下一个“CPU执行期最短”的进程,为之分配CPU。

该算法虽可获得较好的调度性能,但难以准确地知道下一个CPU执行期,而只能根据每一个进程的执行历史来预测。

SJF遇到的问题是长任务的程序可能饥饿。


优先级算法:

   这是一种根据进程的价值和其对CPU时间的需求来对进程分级的想法。优先级高的进程先运行,低的后运行,相同优先级的进程按FIFO方式进行调度。优先级算法也分为可抢占和不可抢占的。可抢占式的响应度高,当获得一个新的请求时,先比较新进程与当前进程的优先级,优先级高的可以抢占当前进程。当然这种方式更易导致低优先级进程饿死,可以采用老化的方式来解决这个问题。

这种算法会导致无穷阻塞或饥饿。



轮转法(RR)

前几种算法主要用于批处理系统中,不能作为分时系统中的主调度算法,在分时系统中,都采用时间片轮转法。

简单轮转法:系统将所有就绪进程按FIFO规则排队,按一定的时间间隔把CPU分配给队列中的进程。这样,就绪队列中所有进程均可获得一个时间片的CPU而运行。

该方法的缺点就是调度频繁,上下文切换耗时较多。RR的性能受限于时间片的大小。这个算法的关键点在于时间片的选择,时间片过大,那么轮转就越接近FIFO,如果太小,进程切换的开销大于执行程序的开销,从而降低了系统效率。因此选择合适的时间片就非常重要。选择时间片的两个需要考虑的因素:一次进程切换所使用的系统消耗以及我们能接受的整个系统消耗、系统运行的进程数。


最高响应比优先算法(HRN)
按响应比由大到小的次序调度。
响应比计算公式如下:
rr=(bt+wt)/bt  
BT为CPU阵发时间,WT为等待时间。显然,对于同时到达的任务,处理时间短的将被优先调度,处理时间较长的作业将随其等待时间的增加而动态提升其响应比,因而不会出现饿死现象。


linux下的进程调度:

linux实现公平调度基本上是两种思路:
1、给处于可执行状态的进程分配时间片(按照优先级),用完时间片的进程被放到“过期队列”中。等可执行状态的进程都过期了,再重新分配时间片;
2、动态调整进程的优先级。随着进程在CPU上运行,其优先级被不断调低,以便其他优先级较低的进程得到运行机会;(老化)
   后一种方式有更小的调度粒度,并且将“公平性”与“动态调整优先级”两件事情合而为一,大大简化了内核调度程序的代码。因此,这种方式也成为内核调度程序的新宠。