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)工具可以改变实时进程优先级和所有进程的调度方式,其可调整的内容如下所示:
用 top 显示出的 pr 值与进程实际优先级的关系