Linux 的 CPU 调度

内核版本与 CPU 调度算法

早期 Linux 版本中的调度算法非常简单易懂:在每次进程切换时,内核扫描可运行进程的链表,计算进程的优先权,然后选择 “最佳” 进程来运行。这个算法的主要缺点是选择 “最佳” 进程所要消耗的时间与可运行的进程数量相关,因此,这个算法的开销太大,在运行数千个进程的高端系统中,要消耗太多的时间。

Linux 2.6 的调度算法就复杂多了。通过设计,该算法较好地解决了与可运行进程数量的比例关系,因为它在固定的时间内(时间复杂度 O (1))选中要运行的进程。它也很好地处理了与处理器数量的比例关系,因为每个 CPU 都拥有自己的可运行进程队列。而且,新算法较好地解决了区分交互式进程和批处理进程的问题。因此,在高负载的系统中,用户感到在 Linux2.6 中交互应用的响应速度比早期的 Linux 版本要快。

调度方式

内核 2.6 版本有 5 种调度方式,分别是

  • SCHED_FIFO
  • SCHED_RR
  • SCHED_IDLE
  • SCHED_BATCH
  • SCHED_OTHER

## 两种类型进程比较

两种进程动态优先级进程 (非实时进程)静态优先级进程 (实时进程)
优先级
能否调整用户可调 nice 值,但最终由系统动态调整用户可通过 chrt 改,系统不会动态调整
应用一般用户进程内核进程
调度方式SCHED_IDLE(BATCH/OTHER)SCHED_FIFO(RR)
top 显示的 pr 值大于 0RT 或负值

由此可知,top 命令显示的 pr 值越小,优先级越高

chrt 工具

通过 chrt(change real time)工具可以改变实时进程优先级所有进程的调度方式,其可调整的内容如下所示:

用 top 显示出的 pr 值与进程实际优先级的关系