日期:2014-05-16  浏览次数:20581 次

(莱昂氏unix源代码分析导读-21)时钟中断处理

时钟中断是系统中最重要的中断,每个时钟滴答都会产生时钟中断,它的中断矢量为(0100)(0103)

 

0533: . = 100^.

0534:       kwlp; br6

0535:       kwlp; br6

 

0569: .globl  _clock

0570: kwlp:  jsr r0,call; _clock

 

显然,时钟中断会通过call例程调用_clock函数,对clock函数,11.1小节有详细的介绍。

 

我在这里只谈几个问题:

1.参数

clock(dev, sp, r1, nps, r0, pc, ps)7个参数,想要逐一了解他们,请回头看看上面的栈图;

 

2.时钟中断是典型的“多用途”中断,它需要进行多个层次的处理。实际上,clock函数对时间进行

    3个维度的处理:

  1)时钟滴答

       修改p_cpu值,对于大多数进程来说,p_cpu就是占用的cpu滴答数,但如果进程执行时间较长的话,

      p_cpu的值会有一个回归——其作用是防止进程的优先级变的太低而导致饿死。

       检查定时器,看是否需要执行操作。

 

  2)秒

       修改u.stimeu.utimetime[ ]等以秒为单位的计时器。

       甚至还有以4s为单位的系统进程唤醒。

 

3)时间片

       此版本的unix正好使用1秒作为一个时间片,故与秒的处理发生了重叠。

 

3Clock函数的各项工作的“Priority

   显然,在clock函数的多项工作中,优先级是不同的,而且各项工作对于时延的容忍程度是不同的。

   对秒级、时间片级的工作——即使是推迟几个时钟滴答再处理对整体的影响也不大。

 

于是,clock函数内对低优先级、高耗时的工作进行了控制——会进行这