那天看到我的博客留言有这样一个问题:父子进程分配时间片时,调度器是不是CFS呢?看到这个问题之后,我不知道如何回答,我也不知道,所以下定决心这两天好好看看进程调度。 2.6.23 内核中包含了一个重要的变化,用CFS替代了以前的调度器。CFS 被合并到 mainline 之前,关于内核调度器还有一个重要的 调度器:RSDL。
进程调度是操作系统的核心功能。调度器只是是调度过程中的一部分,进程调度是非常复杂的过程,需要多个系统协同工作完成。而调度器,它的主要工作是在所有 RUNNING 进程中选择最合适的一个。作为一个通用操作系统,Linux 调度器将进程分为三类。
(1)交互式进程。此类进程有大量的人机交互,因此进程不断地处于睡眠状态,等待用户输入。典型的应用比如编辑器 vim。此类进程对系统响应时间要求比较高,否则用户会感觉系统反应迟缓。
(2) 批处理进程。此类进程不需要人机交互,在后台运行,需要占用大量的系统资源。但是能够忍受响应延迟。比如编译器。
(3) 实时进程。实时进程往往执行非常重要的操作,要求立即响应并执行。
根据进程的不同分类 Linux 采用不同的调度策略。对于实时进程,采用 FIFO 或者 Round Robin 的调度策略。对于普通进程,则需要区分交互式和批处理式的不同。
传统 Linux 调度器提高交互式应用的优先级,使得它们能更快地被调度。而 CFS 和 RSDL 等新的调度器的核心思想是“完全公平”。这个设计理念不仅大大简化了调度器的代码复杂度,还对各种调度需求的提供了更完美的支持。
我们先来看一下 Linux2.4 的调度器。该调度器简单的来说就是对 runqueue 中所有进程的优先级进行依次进行比较,选择最高优先级的进程作为下一个被调度的进程。而且实时进程的优先级始终大于普通进程。该调度器的主要缺点是可扩展性不好以及调度性能低。
linux2.6的O(1)调度器主要解决了前面调度器的扩展性,而且O(1)调度算法所话费的时间为常数。O(1)调度器在两个方面修改了Linux2.4调度器,一是进程优先级的计算方法;二是pick next算法。
(1).Pick next算法借助于active数组,无需遍历runqueue;
(2).取消了定期更新所有进程counter的操作,动态优先级的修改分布在进程切换,时钟tick中断以及其它一些内核函数中进行。
今天就写到这儿,后续我会将楼梯调度算法。RSDL。CFS算法。
阅读(5920) | 评论(8) | 转发(1) |