Appearance
题目
定时器产生时钟中断后,由时钟中断服务程序更新的部分内容是( )。
Ⅰ. 内核中时钟变量的值 Ⅱ. 当前进程占用 CPU 的时间 Ⅲ. 当前进程在时间片内的剩余执行时间
错因
A
承认时钟中断要更新系统时间和累计 CPU 时间,但漏掉了 Ⅲ。也许把"时间片剩余"想成调度器在切换时才一次性算的——但调度器需要知道"还剩多少时间片才需要切",必须有人在每次时钟中断里把剩余时间减掉,否则调度器没数据可看。这件事就发生在时钟中断服务程序里。
B
承认 Ⅱ Ⅲ 这两个跟"进程"相关的更新,把 Ⅰ 时钟变量误以为是"硬件计时器自己维护的"。其实硬件 RTC/定时器只负责按周期触发中断,内核里那个 jiffies / tick 变量是时钟中断 ISR 自己 +1 的——没有它,OS 就没法回答"现在是几点钟、相对开机过了多久"。
C
承认 Ⅰ Ⅲ 但跳过了 Ⅱ。可能觉得"进程占用 CPU 时间"是进程切换或退出时才统计的。实际上每次时钟滴答都会把"当前正在跑的进程"的 CPU 累计时间加 1 个 tick——这是 top、ps 能看到 CPU 利用率的来源,也是 OS 做调度统计、计费的基础。
总解析
时钟中断每个 tick 触发一次,ISR 里要做的更新可以按"作用对象"分:
| 更新对象 | 操作 | 用途 |
|---|---|---|
| Ⅰ 内核时钟变量(jiffies / tick 计数) | +1 | 维护系统时间,给 gettimeofday、定时器、内核日志使用 |
| Ⅱ 当前进程占用 CPU 的累计时间 | +1 tick | 进程会计、top 显示、调度反馈 |
| Ⅲ 当前进程在时间片内的剩余时间 | −1 tick | 时间片轮转判断该不该切换;剩余 ≤ 0 时通知调度器 |
这三件事每个 tick 都做,缺一不可:
- 没 Ⅰ → 系统时间停摆
- 没 Ⅱ → 没法做 CPU 统计和调度反馈
- 没 Ⅲ → 时间片轮转无法触发,进程跑死也不被切走
三项都要更新。
最终答案是 D。