第 30 章 应用程序时间戳
执行频繁时间戳的应用程序会受到读取时钟的 CPU 成本的影响。用于读取时钟的高成本和时间可能会对应用程序的性能造成负面影响。
您可以通过选择一个具有读机制的硬件时钟来降低读取时钟的成本,比默认时钟更快。
在 RHEL for Real Time 中,可以使用带有 clock_gettime () 函数的 POSIX 时钟来获取更多性能,以生成可能最低 CPU 成本的时钟读取。
这些好处对于使用带有高读取成本的硬件时钟的系统更为明显。
30.1. POSIX 时钟 复制链接链接已复制到粘贴板!
POSIX 是实施和代表时间源的标准。您可以为应用程序分配 POSIX 时钟,而不影响系统中的其他应用程序。这与内核选择并在系统中实施的硬件时钟相反。
用于读取给定 POSIX 时钟的函数是 clock_gettime (),它在 < time.h > 中定义。内核与 clock_gettime () 对应的是系统调用。当用户进程调用 clock_gettime () 时:
-
对应的 C 库(
glibc)调用sys_clock_gettime ()系统调用。 -
sys_clock_gettime ()执行请求的操作。 -
sys_clock_gettime ()将结果返回给用户程序。
但是,从用户应用程序切换到内核的上下文具有 CPU 成本。虽然这个成本非常低,但如果操作重复了数千次,但累积的成本可能会对应用程序的整体性能产生影响。为了避免上下文切换到内核,从而更快地读取时钟,支持 CLOCK_MONOTONIC_COARSE 和 CLOCK_REALTIME_COARSE POSIX 时钟,格式为虚拟动态共享对象(VDSO)库函数。
使用其中一个 _COARSE 时钟变体执行 clock_gettime () 的时间读取不需要内核干预,且完全在用户空间中执行。这会显著提高性能。_COARSE 时钟读取的时间具有毫秒(ms)解析,这意味着不会记录小于 1 ms 的时间间隔。POSIX 时钟的 _COARSE 变体适合可容纳 millisecond 时钟分辨率的任何应用程序。