6

在Linux上JavaSystem.nanoTime()的单调实现依赖于操作系统上可用的事实。如果它不可用,则在使用. 例如,以下测试可能会失败。CLOCK_MONOTONICgettimeofdaynanoTime

long t1 = System.nanoTime();
long t2 = System.nanoTime();
assert t2 >= t1

在什么情况下CLOCK_MONOTONIC可能在服务器上不可用?假设CLOCK_MONOTONIC所有现代 Linux 服务器上都可以使用时钟是否合理?

4

2 回答 2

6

假设所有现代 Linux 服务器上都可以使用 CLOCK_MONOTONIC 时钟是否合理?

是的。假设是合理的。

从 gettime 手册条目的措辞中,我们可以推断出真正的旧版本 glibc 不支持CLOCK_MONOTONIC. (我仍在试图弄清楚有多老......但可能是当 glibc 声称符合 POSIX 1003.1 时。)

CLOCK_MONOTONIC(至少)在 IEEE Std 1003.1, 2004 Edition 中指定,尽管兼容的 libc 实现仍有可能不支持CLOCK_MONOTONIC.

CLOCK_MONOTONICLinux 内核源代码至少从 Linux 3.0 (2011)开始就支持时钟。

从其他来源来看,它还取决于您系统的 glibc 是如何构建的。(当使用“模拟计时器”构建时,CLOCK_MONOTONIC不支持。)

以下是一些不支持的情况:


也有可能CLOCK_MONOTONIC得到支持但有问题:

于 2018-07-15T03:31:15.423 回答
2

假设所有现代 Linux 服务器上都可以使用 CLOCK_MONOTONIC 时钟是否合理?

我只能评论这个问题。是的,你使用的所有生产级系统都有一个 Linux 知道如何访问的单调时钟是合理的。虚拟服务器和容器服务器也是如此。

良好的工程要求您对此进行检查并在假设被打破时排除错误,但我会在设计时指望这一点。

于 2018-07-15T03:29:28.373 回答