JJJ:linux时间子系统相关术语
文章目录
- 墙上时间
- 内核管理的各种时间
- 无时钟滴答模式(tickless mode 或 no-tick mode)
- 简要介绍
- 具体实现
- 动态时钟滴答 Dynamic Ticks
- 完全无时钟滴答(Full Tickless)
- nohz sleep
- 单触发模式 oneshot mode
墙上时间
真实世界的真实时间
内核管理的各种时间
RTC时间
在PC中,RTC时间又叫CMOS时间,它通常由一个专门的计时硬件来实现,软件可以读取该硬件来获得年月日、时分秒等时间信息,而在嵌入式系统中,有使用专门的RTC芯片,也有直接把RTC集成到Soc芯片中,读取Soc中的某个寄存器即可获取当前时间信息。一般来说,RTC是一种可持续计时的,也就是说,不管系统是否上电,RTC中的时间信>息都不会丢失,计时会一直持续进行,硬件上通常使用一个后备电池对RTC硬件进行单独的供电。因为RTC硬件的多样性,开发者需要为每种RTC时钟硬件提供相应的驱动程>序,内核和用户空间通过驱动程序访问RTC硬件来获取或设置时间信息。
xtime
xtime和RTC时间一样,都是人们日常所使用的墙上时间,只是RTC时间的精度通常比较低,大多数情况下只能达到毫秒级别的精度,如果是使用外部的RTC芯片,访问速度也比较慢,为此,内核维护了另外一个wall time时间:xtime,取决于用于对xtime计时的clocksource,它的精度甚至可以达到纳秒级别,因为xtime实际上是一个内存中的>变量,它的访问速度非常快,内核大部分时间都是使用xtime来获得当前时间信息。xtime记录的是自1970年1月1日24时到当前时刻所经历的纳秒数。
monotonic time
该时间自系统开机后就一直单调地增加,它不像xtime可以因用户的调整时间而产生跳变,不过该时间不计算系统休眠的时间,也就是说,系统休眠时,monotoic时间不会>递增。
xtime虽然正常情况下也是递增的,但是毕竟用户可以主动向前或向后调整墙上时间,从而修改xtime值。但是monotonic时间不可以往后退,系统启动后只能不断递增。
raw monotonic time
该时间与monotonic时间类似,也是单调递增的时间,唯一的不同是:raw monotonic time“更纯净”,他不会受到NTP时间调整的影响,它代表着系统独立时钟硬件对时间的
统计。
boot time
与monotonic时间相同,不过会累加上系统休眠的时间,它代表着系统上电后的总时间。
时间种类 | 精度(统计单位) | 访问速度 | 是否包含累计休眠时间 | 受NTP调整的影响 |
---|---|---|---|---|
RTC | 低 | 慢 | Yes | Yes |
xtime | 高 | 快 | Yes | Yes |
monotonic | 高 | 快 | No | Yes |
raw monotonic | 高 | 快 | No | No |
boot time | 高 | 快 | Yes | Yes |
无时钟滴答模式(tickless mode 或 no-tick mode)
简要介绍
在传统系统中,CPU 会定期接收时钟中断(ticks),即使它处于空闲状态。这些周期性的时钟中断会导致 CPU 不必要地从低功耗状态唤醒,增加了能耗并减少了电池寿命
。
通过减少不必要的时钟中断,使 CPU 能够更长时间地保持在低功耗状态。
具体实现
动态时钟滴答 Dynamic Ticks
Linux 内核中实现无时钟滴答模式的一种方式。此模式下,当系统没有任务需要调度或处理时,内核可以关闭周期性的时钟中断,允许 CPU 进入更深的睡眠状态,从而节>省能源。内核会重新编程硬件定时器以在下一个关键事件的时间点触发一次性的时钟中断,将 CPU 唤醒以处理这些事件。
完全无时钟滴答(Full Tickless)
不仅在 CPU 空闲时关闭时钟中断,而且在某些情况下即使 CPU 处于活跃状态也可以关闭时钟中断。
nohz sleep
CPU 在进入深度空闲状态(deep idle state)时关闭周期性时钟中断(ticks),以减少功耗并延长电池寿命。这种技术允许 CPU 在没有任务需要处理的情况下进入低功>耗模式,并且只有在有定时器到期或其他唤醒事件发生时才会被重新唤醒。
单触发模式 oneshot mode
与周期性模式不同,单触发模式允许系统仅在需要时触发定时器中断,而不是按照固定的周期重复触发。
在内核中有枚举类型来只是这两种模式
enum tick_device_mode {
TICKDEV_MODE_PERIODIC,
TICKDEV_MODE_ONESHOT,
};
通过全局变量tick_cpu_device.mode来指示处于哪种模式