Linux 内核时钟系统和定时器实现


Linux 2.6.16之前,内核只支持低精度时钟,内核定时器的工作方式:
  • 系统启动后,会读取时钟源设备,初始化当前系统时间;
  • 内核会根据HZ(系统定时器频率,节拍率)参数值,设置时钟事件设备,启动 tick(节拍)中断。HZ表示1秒种产生多少个时钟硬件中断,tick 就表示连续两个中断的间隔时间。
  • 设置时钟事件设备后,时钟事件设备会定时产生一个 tick 中断,触发时钟中断处理函数,更新系统时钟,并检测 timer wheel,进行超时事件的处理。

Linux 2.6.16 ,内核支持了高精度的时钟,内核采用新的定时器hrtimer,其实现逻辑和Linux 2.6.16 之前定时器逻辑区别:
  • hrtimer 采用红黑树进行高精度定时器的管理,而不是时间轮;
  • 高精度时钟定时器不再依赖系统的 tick 中断,而是基于事件触发。

新内核的 hrtimer 的触发和设置不像之前在定期的 tick 中断中进行,而是动态调整的,即基于事件触发,hrtimer的工作原理:通过将高精度时钟硬件下次中断触发时间设置为红黑树中最早到期的 Timer 的时间,时钟到期后从红黑树中得到下一个 Timer 的到期时间,并设置硬件,如此循环反复。

概念:
时钟源设备(closk source device):抽象那些能够提供计时功能的系统硬件,比如 RTC(Real Time Clock)、TSC(Time Stamp Counter),HPET,ACPI PM-Timer,PIT 等。不同时钟源提供的精度不一样,现在 pc 大都是支持高精度模式(high-resolution mode)也支持低精度模式(low-resolution mode)。
时钟事件设备(clock event device):系统中可以触发 one-shot(单次)或者周期性中断的设备都可以作为时钟事件设备。

中断英语:Interrupt)是指处理器接收到来自硬件或软件的信号,提示发生了某个事件,应该被注意,这种情况就称为中断。