“单调时钟”容易让人联想到一个从开机起永远严格递增的数字。Linux man-pages 6.19对CLOCK_MONOTONIC的说明更加具体:它不可设置,在Linux上对应系统开机以来的单调时间参照,同时不计入系统处于挂起状态的时间。[1] “从开机起”在这里不能直接省略后一项条件。

手册先把不连续跳变与频率校正分开。CLOCK_MONOTONIC不受系统时间突然向前或向后变化的影响,却会受到频率调整的影响。[1] 因而,单调所约束的并不是“任何调整都不存在”。资料中若写它不会随手动改变系统时钟而突然跳变,还不能继续改写成它与所有校正机制完全隔绝。

连续读取的规则也有细节。原文保证返回时间不会向后,但指出依架构而定,相邻调用可能得到相同、没有增加的时间值。[1] 不倒退与每一次都严格变大,因此是两个不同强度的说法。一个相同值仍可能符合该手册所述关系;不能仅凭两次值相等,就在没有其他证据时断言时钟已经停止或系统出错。

CLOCK_MONOTONIC_RAW处理的是另一项区别。手册称它提供基于原始硬件的时间,不受频率校正影响;同时它也不计入系统挂起时间。[1] RAW与普通MONOTONIC的不同,首先落在频率校正这一项,而不是把挂起时间重新加回来。只看RAW名称中的“原始”,没有完整说明其计时范围。

CLOCK_BOOTTIME则与MONOTONIC相同,但额外包含系统挂起的时间。[1] 原文把它描述为能够感知挂起的单调时钟。于是,若一份纸面情境包含运行、挂起、恢复三个阶段,BOOTTIME与MONOTONIC所涵盖的时段可能不同;这里说的是依据手册定义作出的概念分析,并没有在当前电脑上制造挂起或读取实际差值。

把这三项放在一起,可以看出两条独立的比较线索。一条问是否受频率校正:MONOTONIC与RAW在这一点不同。另一条问是否包含挂起时间:MONOTONIC与BOOTTIME在这一点不同。[1] 不能用一个“更原始”或“更完整”的形容词同时替代这两项条件,也不能把RAW与BOOTTIME误当作同一种变化。

对操作系统资料交接,这种区分能使“经过多久”的对象更准确:是在统计不含挂起的运行参照,还是包含挂起的开机跨度;是在谈时间不会倒退,还是谈它如何受到频率校正。本文限于Linux手册上述三个时钟的连续定义,没有运行示例、修改系统时间或给应用选择时钟的配置建议。条目日期与HTML生成日期不充作首次发布日期,来源首发仍未知。

资料:[1] https://www.man7.org/linux/man-pages/man2/clock_gettime.2.html

信息来源

本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。