2011-05-08 79 views
1

我在clock_gettime可以訪問不同的時鐘有困難。尤其是我感興趣的是:理解問題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

您的系統時鐘源可能設置爲TSC而不是HPET。

在現代多核系統中,HPET是一個更加精確和一致的新系統,TSC是一個性能更高的舊系統。

在openSUSE上,你可以找到你的當前clocksource就是通過

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

要設置時鐘源HPET在openSUSE,做

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

延伸閱讀:

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

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

2
  • CLOCK_REALTIME讓您訪問實時時鐘,即存儲當前日期和時間的時鐘。
  • CLOCK_MONOTONIC讓您訪問時間永遠不會回來的時鐘,您應該使用這個而不是CLOCK_REALTIME
  • CLOCK_PROCESS_CPUTIME_ID爲您提供特定於當前進程的時鐘,爲您提供進程的CPU時間(CPU運行該特定進程所用的時間)。
  • CLOCK_THREAD_CPUTIME_ID爲您提供特定於當前線程的時鐘,爲您提供進程的CPU時間(CPU運行該特定線程所用的時間)。
+0

我可以猜測CLOCK_REALTIME被重置嗎?這是我用這個時鐘得到的錯誤順序的唯一解釋。 – 2011-05-08 23:42:06

+1

在Linux上,CLOCK_REALTIME和CLOCK_MONOTONIC由於系統時間調整而受到不連續性的影響,例如,由ntpd。使用CLOCK_MONOTONIC_RAW獲取實際保證不會及時倒退的定時器。 – 2012-02-16 06:00:39

+0

@BDatRivenhill +1有助於解決我的消極時間流逝問題 – kfmfe04 2012-12-07 04:49:04