基于Linux内核的CFS算法分析
1引言
随着Linux内核的不断发展,Linux已经被许多人视为是未来最有前途的操作系统之一。对系统中运行的进程来说,操作系统提供了一个供其独占的虚拟机环境;而对于使用计算机的用户来说,操作系统提供了在任意硬件平台(包括单处理器和多处理器)上并行执行进程的能力。尽管在一个CPU之上同时只可能有一个任务(进程)在运行,但由于在多任务操作系统中,在同一时刻可能有多个任务处于就绪状态,这时操作系统需要根据这些任务的重要程度、占用的硬件资源等,选择一个合适的任务运行。这时就引入了任务调度器(Process Scheduler)机制,以用来对当前系统中的多个可执行任务进行调度管理。
从当前系统中的多个就绪任务中选择哪个,让它执行多长时间,以及是否运行其他任务打断它的执行,这些都是任务调度器的主要任务,一般称为任务调度器的调度算法。由于调度算法在很大程度上决定了系统对硬件资源的利用效率和系统用户的使用体验等,所以调度算法的设计与实现是任务调度器乃至整个操作系统设计与实现中的关键。Linux 2.4内核的O(n)算法和早期Linux 2.6内核的O(1)算法都是以往调度算法中的经典算法,但是存在着一些缺点。Linux 2.6.23内核发布的CFS算法将公平的理念用到调度算法中,具有划时代的意义。本文将在以往调度算法优缺点的基础上重点介绍CFS调度算法。
2Linux 2.4与Linux 2.6调度算法简介
2.1Linux 2.4内核调度算法
Linux 2.4内核采用的调度算法是基于优先级的设计。它在每次任务切换时,内核扫描可运行任务的链表,计算任务的优先级,然后选择“最佳”任务来进行。
通过对2.4调度算法研究,从该任务调度器的设计与实现方式等角度来看,其主要存在以下一些缺陷:
1)选择最佳任务的流程的时间代价为O(n),在系统任务数量较多的情况下执行开销太
大,导致系统性能下降严重
2)由于runqueue(就绪队列)是内核全局数据结构,在多处理器环境中,属于临界资
源,需要利用自旋锁保护,这样如果系统中同时有多个处理器需要任务调度时,只
能依次获取自旋锁并进行调度,无法充分发挥多处理器的并行优势
3)简易的优先级和时间片机制,无法满足交互式任务的低响应时间要求