内核版本与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