【问题标题】:Android(Linux) uptime using CLOCK_MONOTONIC使用 CLOCK_MONOTONIC 的 Android(Linux) 正常运行时间
【发布时间】:2011-09-15 15:44:39
【问题描述】:

根据Android Developer Reference uptimeMillis() 返回自启动以来的毫秒数,不计算深度睡眠所花费的时间。我检查了执行 uptimeMillis() 在我的代码中大致是这样的-

struct timespec t;
t.tv_sec = t.tv_nsec = 0;
clock_gettime(CLOCK_MONOTONIC, &t);
return (int64_t)(t.tv_sec)*1000000000LL + t.tv_nsec;

据我所知,CLOCK_MONOTONIC 从一些未指定的点线性计算,包括睡眠时间。

这是我的疑问-

  1. 如果CLOCK_MONOTONIC 包含睡眠时间,为什么uptimeMillis() 不考虑呢?如果我的理解是错误的并且CLOCK_MONOTONIC 没有考虑睡眠,那么我应该使用什么来获得包括睡眠在内的系统正常运行时间?

  2. 什么是深度睡眠? CPU 空闲是否称为深度睡眠?

  3. Linux中unspecified point的值是多少?您能否在代码中指出这个时钟的开始位置?

【问题讨论】:

    标签: android linux time linux-kernel


    【解决方案1】:
    1. CLOCK_MONOTONIC 在系统挂起时停止。有些人认为这是一个错误,随后出现了添加 CLOCK_BOOTTIME 时钟的补丁:https://lwn.net/Articles/428176/我不知道这些补丁是否已经包含在主线内核中。 CLOCK_BOOTTIME 在 ndk-9c 中 - 只用了 2.5 年 ;) – Wojciech

    2. 我猜是暂停。

    3. IIRC 在启动前的某个固定时间。如果您深入研究内核源代码,您会找到确切的值。再说一次,关于它未指定的全部意义在于它可能随时改变,所以依赖它对我来说似乎是不明智的。

    【讨论】:

    • 非常感谢 janneb!这很有帮助。但是你能详细说明暂停吗?挂起是指进程挂起还是整个CPU处于空闲状态?
    • @Pavan:暂停,因为整个系统都被暂停了。
    • 再次感谢!我在 2.6.35 签入。 CLOCK_BOOTTIME 还没有!但是SystemClock.elapsedRealtime() 仍然可以做到!知道它是怎么做的吗?
    • @Pavan:方法名称中的“Realtime”表明它是一个实时时钟,你不觉得吗? Wrt CLOCK_BOOTTIME,我链接的补丁发布于 2011 年 2 月,而 2.6.35 发布于 2010 年 8 月,所以你不会在那里找到它并不奇怪..
    • CLOCK_BOOTTIME 在 ndk-9c - 只用了 2.5 年 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    相关资源
    最近更新 更多