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值 大于0 RT或负值

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

chrt工具

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

[][1]

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

[][2]    [1]:https://wulc.me/imgs/d26a3eab-a2f3-11e5-9531-e55c4553df92.png [2]:https://wulc.me/imgs/imagepriority.png