Skip to content

第二章:时间片调度

这篇文章是关于操作系统如何通过时间片轮转调度(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内核调度器的工作原理。

基于 知识共享 CC BY-NC-SA 许可发布