Linux Kernel 2.6 CFS scheduler 学习笔记


Linux是多任务操作系统(multitask OS), 在单处理器系统上,多任务操作系统需要使得在其上运行的进程认为是自己使得独占处理器资源,所以这仅仅是逻辑上的并行。在多处理器系统里,多任务操作系统可以实现真正实现并行,也就是在不同的处理器上运行着不同的进程。而如何在这两种的机器上实现多进程并行执行(逻辑上和物理上),则是调度器的主要任务。

Linux scheduler的历史

从1991年linux OS面世以来,到linux 2.4之前, linux的kernel scheduler的设计很简单。

在linux1.2中,scheduler采用循环队列来管理正在系统中运行的task(process),并且采用round-robin调度策略(policy)来进行task调度。 在linux 2.2 中,linux kernel scheduler引入了scheduling class的概念,并且对real time task, non-preemptible, non-real-time task 提供不同的调度策略。并且从linux2.2开始,scheduler开始支持SMP。

在linux 2.4以前kernel当中的scheduler的设计尽管设计简单,容易实现,但是它在扩展性方面很差,尤其上在系统中有大量的进程存在需要调度,或在多个处理器的系统当中,该缺点尤其明显。

所以,为了克服linux 2.4之前scheduler的缺点,在linux 2.5和linux 2.6早期的版本当中,引入了O(1) scheduler。O(1)引入了常量时间内timeslice的计算算法  和 为每个处理器管理一个runqueue,来修正之前scheduler设计的缺陷。

O(1) scheduler 拥有很好的可扩展性, 但是其需要维护大量的代码来实现其复杂的启发式算法,这是难以维护的。同时,O(1)在面对latency-sensitive 的任务的时候(通常称为交互性任务)表现不是很好。所以在linux 2.6 kernel 系列的早期,开发者们引入了旨在提高O(1)在面对latency-sensitive 任务前性能的改动。在这其中,最值得注意的是RSDL(Rotating Staircase DeadLine) scheduler,这该scheduler中引入了fair scheduling的概念(来至于排队论)。而这是RSDL的出现,最终在其基础上,Ingo Molnar 实现了CFS(Complete Fair Scheduler),并最终被linux kernel采纳。

相关内容