Linux计时体系结构

from:Linux计时体系结构


Linux必定执行与定时相关额度操作,所以内核会周期性地做如下操作:

  1. 更新自系统启动一来所经过的时间。

  2. 更新时间和日期。

  3. 确定当前进程在每个CPU上已经运行了多长时间,如果已经超过了分配给它的时间,则抢占它。

  4. 更新资源使用统计数。

  5. 检查每个软定时器的时间间隔是否已经达到。

Linux的计时体系结构是一组与时间流相关的内核数据结构和函数。实际上,基于80x86多处理器机器所具有的计时体系结构与单处理器机器所具有的稍有不同:

  1. 在单处理器系统上,所有的计时活动都是由全局定时器1产生的中断触发的。

  2. 再多处理器系统上,所有普通的活动,像软定时器的处理,都是由全局定时器产生的中断触发的,而具体CPU的活动,类似监控当前运行进程的执行时间是由本地APIC定时器产生的中断触发的。

可惜,以上两种情况的区别有点模糊,例如,某些早期基于Intel 80486处理器的SMP系统不拥有本地APIC。即使到了今天,还有一些SMP主板有瑕疵,因此本地时钟中断根本不文档。在这些情况下,SMP内核必须采用单处理器系统的计时体系结构。另一方面,新近的单处理器系统拥有本地APIC,因此UP内核通常可以使用SMP的计时体系结构。

Linux的计时体系结构还依赖于时间戳计数器TSC、ACPI电源管理定时器、高精度事件定时器HPET的可用性。内核使用两个基本的计时函数,一个保持当前最新的时间,另一个计算再当前秒内走过的纳秒数。

有几种不同的方式获得后一个值,如果CPU有TSC或HPET,就可以用一些更精确的方法,在其他情况下,使用精确性差一些的方法。

计时体系结构的数据结构


计时是体系结构相关的,所以我们只关心80x86体系结构下最重要的变量。


  1. 可以是可编程间隔定时器也可以是高精度事件定时器。