第二章:时间片调度
这篇文章是关于操作系统如何通过时间片轮转调度(timeslice round-robin scheduling)来实现多任务处理的。
1. 多任务处理的挑战:
- 假设你在构建一个操作系统,用户需要同时运行多个程序。
- 你的CPU不支持多核处理,只能一次执行一个指令。
2. 模拟并行性:
- 通过让进程轮流在CPU上运行,可以模拟并行性。
- 通过周期性地在进程间切换并执行每个进程的几个指令,可以使得所有进程都保持响应,而没有单一进程独占CPU。
3. 如何控制进程切换:
- 利用大多数计算机自带的定时器芯片(timer chips),可以设置在一定时间后触发操作系统中断处理程序。
- 这涉及到硬件中断的使用,与软件中断不同,硬件中断是由硬件(如定时器芯片)触发的。
4. 硬件中断的工作原理:
- 设置定时器芯片在一段时间后触发中断。
- 操作系统切换到用户模式并执行程序的下一条指令。
- 定时器到期时触发硬件中断,切换到内核模式并跳转到操作系统代码。
- 操作系统保存当前程序的状态,加载不同的程序,并重复此过程。
5. 时间片计算:
- 时间片(timeslice)是操作系统调度器允许一个进程运行的时间长度,然后进行抢占。
- 最简单的方法是给每个进程相同的时间片,例如10毫秒,并按顺序循环执行任务,这称为固定时间片轮转调度。
6. 时间片术语:
- 时间片也常被称为“量子”(quantums)。
- Linux内核开发人员使用“jiffy”时间单位来计算固定频率的定时器滴答声,用于测量时间片的长度。
7. 目标延迟与动态时间片:
- 改进固定时间片调度的方法是选择一个目标延迟,即进程响应的理想最长时间为被抢占后恢复执行的时间。
- 时间片通过将目标延迟除以总任务数来计算,这比固定时间片调度更好,因为它减少了在进程较少时的浪费任务切换。
8. 时间片的最小粒度:
- 进程切换在计算上是昂贵的,因为它需要保存当前程序的整个状态并恢复不同的状态。
- 时间片持续时间有一个下限(最小粒度),这意味着当进程数量足够多,以至于最小粒度生效时,目标延迟可能会被超过。
9. Linux调度器:
- 文章撰写时,Linux的调度器使用6毫秒的目标延迟和0.75毫秒的最小粒度。
- Linux自2007年以来使用的调度器称为完全公平调度器(Completely Fair Scheduler, CFS),它执行许多复杂的计算机科学操作来优先级排序任务和分配CPU时间。
10. 内核抢占性:
- 现代内核,包括Linux,是可抢占的内核,这意味着内核代码本身可以像用户空间进程一样被中断和调度。
11. 历史背景:
- 早期操作系统,包括经典的Mac OS和早期的Windows版本,使用了抢占式多任务处理的前身,称为合作式多任务处理。
- 在合作式多任务处理中,程序本身选择让操作系统接管,通过触发软件中断来允许其他程序运行。
这篇文章提供了操作系统多任务处理的基础知识,特别是时间片轮转调度的概念和实现方式。通过阅读这篇文章,你可以了解到操作系统如何通过时间片来管理多个进程的执行,以及Linux内核调度器的工作原理。