NT 内核调度器浅析之时钟中断(上)
NT 内核调度器浅析
之三 —— 时钟中断(上)
老夫 (fu.hao@zte.com.cn, MSN : fordhawk@163.com)
一、NT 线程调度的时机之一 —— 时钟中断
当老夫还是一个懵懂的 boy 时,曾有幸见到高人玩 DOS 游戏,一边敲击着键盘,一边
听着从喇叭里发出的背景音乐,以至于老夫一度认为 DOS 可以同时执行多个任务。及至老
夫开始学习 8086 汇编之时,才终于明白,DOS 是个单用户单任务的 OS,使用了 TSR(terminate
and stay resident)技术后,得以模拟多任务。等到老夫开始使用 Win98 和 win2000 时,又有
了新的疑惑——在无法使用 TSR 时,单 CPU 上是如何实现同时运行多个任务的?
研读了操作系统理论书籍后,找到了答案——分时。用通信界的话说就是“时分复用”。
小强:“我知道,分时就是把时间分成等份,我想知道是怎么分的?”。
嗯,把老夫要说的都说了。在 X86 系统中,分时工作是由定时器来完成的,在 OS 内核
初始化时设定定时间隔,定时器计数达到间隔值后会产生一个中断,通知 CPU,OS 内核将
对此中断进行相应的处理。这个过程周而复始,直至关机。每隔一定时间产生一次中断,它
犹如内核中跳动的脉搏,给予内核无穷的动力。
对于 NT 系统(具体点儿就是 WinXP)来说,时钟中断的时间间隔是多少呢?根据参考文
献 1 的第六章中所述,这个值是 10 毫秒,而每两个时间间隔组成 6 个 Quantum(时间配额),
也就是说,每个相同优先级的线程一次被允许运行的最大时长是 20 毫秒,每次中断时
Quantum 将被内核扣除 3。
小强:“噢,我明白了,中断之后是不是内核就可以继续工作了呢?”,哦,卖锅的,
回答得完全正确!试想一下,如果时钟中断之后内核什么也不做,那岂不是又回到 DOS 时
代了吗?用专业一点的语言就是,中断后内核重新获得了控制权。
处理中断的代码称为中断处理函数(Interrupt handler),它们是在内核初始化时驻留在内
存中的。所有中断处理函数都是被 CPU 调用的,也就是说,当中断发生时,CPU 查找对应
的中断处理函数对发生的中断进行处理。问题的焦点是时钟中断处理函数都做了些什么?
简单地说,处理过程是这样的:
1、保护被中断的“现场”
由于中断发生的不可预知性,当时钟中断到来时,如果被中断的线程处于用户态,CPU
会自动地从 TSS 中取出当前线程内核栈指针 ESP 并自动将用户态下的 SS:ESP,EFlags,
CS:EIP 压入内核栈中(这一段内核栈在 XP 中称为“陷阱帧”―― TRAP_FRAME),然后
开始保存中断时的线程状态(即 Context),以便中断结束后恢复中断前的状态,继续执行被
1