引言
系统中的 CPU 数量有限,而用户希望「同时」得到服务的进程(任务)常常会多于可用的 CPU 核数,这时就需要聪明的任务调度器来为我们实现 CPU 虚拟化,让每个进程都能得到服务。调度器需要照顾到任务的响应时间(否则用户会在敲击键盘后等很久,体验很渣),还要保证一定的周转时间(CPU 密集型的任务期望获得更多的连续运行时间,从而利用 CPU 缓存亲和性,频繁的任务切换会导致一些性能损失,尤其是现代系统 TLB miss, Page Fault 惩罚非常严重),同时还不能让某些低优先级的任务饿死。可见调度器是实现多任务的核心,现代操作系统必备。
一直以来,各路 Linux Hackers 都希望能为 Linux 提供这样一个调度器,它能够在桌面系统上有较好的交互性,而在高负载的服务器上有较好的吞吐量。
以下列举一些学习资料,可以进一步了解!
学习资料
- 论文:A complete guide to Linux process scheduling,这篇论文讲得比较好,准备翻译出来以供欣赏
- GitBook: Process Scheduling in Linux
- 内核文档:Linux scheduler doc, CFS
Linux 进程与线程:《Linux 系统编程手册 第 28 章及后续》
- 可以关注下和进程线程有关的系统调用
- Pthread 线程是怎么在 Linux 中实现的
The Battle of Schedulers: FreeBSD ULE vs Linux CFS
- 重点可以看下关于 CFS 的简述 & 负载均衡部分
- 可以简单看看 ULE 是的实现原理(interactive, batch queue),为什么可能会有饿死的情况
-
- 早期的 x86 是 Universal Memory Arch, UMA 架构
- NUMA 架构出来后,访问不同内存地址,速度是有差别了,和硬件架构有很大关系
-
- 重点关注作者关于 CFS 列出的几个灵魂拷问
- vruntime 在什么时候发生改变?
- vruntime 初始值是怎么设定的?