定时器中断与系统处于内核模式或用户模式是否独立?

6
在Linux单处理器系统中,计时器中断是否独立于系统处于内核模式或用户模式?
当系统处于内核模式时,计时器中断是否有不同的行为?
1个回答

8
简单来说,无论系统在硬件时钟中断之前处于什么模式,硬件时钟中断服务例程的执行和动态计时器处理程序的调度都不受影响。原因是,时钟定时器中断是一种硬件中断,无论执行是否在内核或用户上下文中(假设启用了定时器中断),都会立即服务,并且时钟定时器中断本身的中断服务例程会引发运行动态计时器处理程序的软件中断。
注意事项:1)我实际上还没有通过实验证明这一点。2)这不适用于无滴答内核或高精度计时器。
Linux内核代码使用“计时器”一词来表示几个不同的东西:
1. 给内核提供“滴答”的硬件定时器或时钟中断 2. 动态计时器 - 内核和驱动程序使用的软件计时器 3. 间隔计时器 - (setitimer和alarm系统调用)用户模式进程的软件计时器 硬件时钟或滴答计时器 在使用硬件时钟提供“tick”的系统中,时钟定时器中断是一种与架构相关的硬件中断。例如,在arch/powerpc/kernel/head_booke.h中查找“timer_interrupt”,然后查看arch/powerpc/kernel/time.ctimer_interrupt实现的中断服务例程(ISR)。当定时器中断发生时,此ISR立即执行,无论当前执行上下文如何。但是,此硬件中断与其他硬件中断不同之处在于,当它返回时,处理过程不会返回到先前的上下文。相反,进入调度程序。
对于一个设置为每秒产生1000个时钟中断的系统,当其他中断正在被服务时,有时会发生时钟中断被屏蔽的情况。这通常被称为“丢失滴答声”问题。如果不补偿丢失的滴答声,负载系统可能会感觉时间变慢。在某些架构上,内核通过使用更细粒度的硬件增量计数器来补偿丢失的滴答声,每次时钟定时器中断时读取并记录其值。通过比较当前滴答声的增量计数器值与前一个滴答声的增量计数器值,内核可以确定是否丢失了一个滴答声。 软件定时器 动态定时器的动态定时器处理程序列表(您使用linux/timer.h设置的类型)已过期,在时钟定时器中断结束之前设置。大致顺序如下:
[arch dependent]:timer_interrupt( )
kernel/time/tick-common.c:tick_handle_periodic( )
kernel/time/tick-common.c:tick_periodic( )
kernel/timer.c:update_process_times( )
kernel/timer.c:run_local_timers( )
kernel/softirq.c:raise_softirq(TIMER_SOFTIRQ)

我省略了设置timer_interrupt处理程序为tick_handle_periodicTIMER_SOFTIRQ的初始化。调用raise_softirq(TIMER_SOFTIRQ)会生成一个软件中断,该中断会立即得到服务。中断服务程序运行动态定时器队列。计时器处理程序在软中断上下文中运行,启用硬件中断。当中断服务程序返回时,调度程序被调用。这意味着,如果有很多计时器设置,则运行队列中的下一个进程将被延迟。如果有丢失的滴答声,则计时器处理程序的执行可能会延迟,但是延迟不取决于在运行时钟定时器中断之前的执行上下文。
关于动态定时器准确性的注意事项:“...内核无法确保计时器函数将从其到期时间开始运行。它只能确保它们在正确的时间或稍后执行,延迟高达几百毫秒。”《深入理解Linux内核》,Bovet和Cesati,第3版,O'reilly。
因此,如果需要更好的计时器准确性,则需要使用高精度计时器。

参考文献:软件中断和实时性


非常感谢Jonathan Ben-Avraham先生的回复。现在我有另一个疑问。假设在单处理器Linux系统中,系统正在服务于内核中断,即系统处于中断上下文,并且同时计时器到期并触发了计时器中断,那么系统会如何表现? - user2282621
2
只要中断请求被禁止,它将等待中断处理程序完成。 - tangrs
1
@user2282621:你好,我添加了一些更详细的内容,希望有所帮助。 - Jonathan Ben-Avraham
“当定时器中断发生时,此ISR会立即执行,无论当前执行上下文如何。” - 不准确。当中断被禁用时(这是一种执行上下文),中断执行可能会延迟。通常这样的中断不会丢失,只是会被延迟直到中断重新启用。只有在前一个中断处理之前,中断引起的条件再次发生时才会出现丢失的情况。 - Chris Stratton
@ChrisStratton:好的,我修复了那个小问题。还有其他的吗? - Jonathan Ben-Avraham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接