如何实现gettimeofday()的微秒分辨率/粒度?
Linux在许多不同的硬件平台上运行,因此具体情况有所不同。在现代的x86平台上,Linux使用时间戳计数器(也称为)
TSC,由多个以133.33
MHz运行的晶体振荡器驱动。晶体振荡器为处理器提供参考时钟,处理器将其乘以某个倍数-例如,在2.93
GHz处理器上,倍数为22。从
TSC历史上看,这是不可靠的时间来源,因为实现会在处理器运行时停止计数器睡眠,或者因为处理器移动乘数以改变性能状态或变热时降低速度而导致倍数不是恒定的。现代x86处理器提供了
TSC那是恒定的,不变的,不停的。在这些处理器上,这
TSC是一个出色的高分辨率时钟,Linux内核在启动时确定初始近似频率。该
TSC规定有gettimeofday()系统调用和纳秒分辨率为clock_gettime()系统调用微秒的分辨率。
如何实现同步?
您的第一个问题是关于Linux时钟如何提供高分辨率的,第二个问题是关于同步的,这是精度和准确性之间的区别。大多数系统都有一个由电池备份的时钟,以保持系统断电的时间。如您所料,该时钟不具有较高的准确性或精度,但是它将在系统启动时“处于正常状态”。为了获得准确性,大多数系统使用可选组件从网络上的外部源获取时间。两种常见的是
- 网络时间协议
- 精确时间协议
这些协议定义了网络上的主时钟(或原子时钟提供的时钟层),然后测量网络延迟以估计与主时钟的偏移量。一旦确定了与主机的偏移量,系统时钟便会
disciplined保持其准确度。这可以通过
- 调整时钟(相对较大,突然且不频繁的时间调整),或
Slewing
时钟(定义为在给定时间段内通过缓慢增加或减少频率来调整多少时钟频率)
内核提供adjtimex系统调用以允许时钟调节。
用于时钟调整的相关内核源文件是kernel / time.c和kernel / time /
timekeeping.c。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)