理解clock_gettime的问题

时间:2011-05-08 21:53:37

标签: linux time clock system-calls

我遇到了clock_gettime可以访问的不同时钟的问题。特别是我感兴趣的是:

  • CLOCK_REALTIME
  • CLOCK_PROCESS_CPUTIME_ID
  • CLOCK_THREAD_COUTIME_ID

我阅读了联机帮助页,但它对我没有多大帮助。我使用clock_gettime来为我的探查器生成时间戳,当它通过套接字发送收集的数据时。我注意到以下差异:

  • CLOCK_REALTIME

我使用此时钟从我的探查器收到的事件有时是错误的顺序。时间戳以更高的值开始,但不是更高。通常,最后的消息(具有更高时间戳的消息)首先出现,然后出现具有较低值的时间戳。

  • CLOCK_PROCESS_CPUTIME_ID
  • CLOCK_THREAD_COUTIME_ID

我发现两个时钟都没有差异,尽管它们的值较小且总是正确排序。

我无法解释这种行为。

2 个答案:

答案 0 :(得分:2)

  • CLOCK_REALTIME可让您访问实时时钟,即存储当前日期和时间的时钟。
  • CLOCK_MONOTONIC可让您访问一个永不过时的时钟,您应该使用此时钟而不是CLOCK_REALTIME
  • CLOCK_PROCESS_CPUTIME_ID使您可以访问特定于当前进程的时钟,为您提供进程的CPU时间(运行该特定进程的CPU所花费的时间)。
  • CLOCK_THREAD_CPUTIME_ID使您可以访问特定于当前线程的时钟,为您提供进程的CPU时间(运行该特定线程的CPU所花费的时间)。

答案 1 :(得分:2)

您的系统时钟源可能设置为TSC而不是HPET。

在现代多核系统中,HPET是一种更加准确和一致的新系统,而TSC是一种性能更高的旧系统。

在openSUSE上,您可以通过

找出当前的时钟源

cat /sys/devices/system/clocksource/clocksource0/current_clocksource

要在openSUSE上将时钟源设置为HPET,请执行

echo 'hpet' > /sys/devices/system/clocksource/clocksource0/current_clocksource

进一步阅读:

http://en.wikipedia.org/wiki/HPET

http://en.wikipedia.org/wiki/Time_Stamp_Counter