Linux C 時間函數clock_gettime()的使用及Linux不同時鐘的區別

函數: int clock_gettime(clockid_t clk_id, struct timespec *tp);

clockid_t: 用於指定計時時鐘的類型,有以下幾種類型:
CLOCK_REALTIME: 系統實時時間,從Epoch計時,可被設置更改。
CLOCK_MONOTONIC: 系統運行時間,從系統啓動時開始計時,系統休眠時不再計時(NTP與硬件時鐘有問題時會影響其頻率,沒有驗證過)。
CLOCK_PROCESS_CPUTIME_ID: 本進程啓動到此刻使用CPU的時間,當使用sleep等函數時不再計時。
CLOCK_THREAD_CPUTIME_ID: 本線程啓動到此刻使用CPU的時間,當使用sleep等函數時不再計時。
CLOCK_MONOTONIC_RAW    : 系統運行時間,從系統啓動時開始計時,系統休眠時不再計時(NTP與硬件時鐘有問題時不會影響其頻率,沒有驗證過)。
CLOCK_REALTIME_COARSE: 系統實時時間,從Epoch計時,可被設置更改,速度更快精度更低。
CLOCK_MONOTONIC_COARSE: 系統運行時間,從系統啓動時開始計時,速度更快精度更低,系統休眠時不再計時(NTP與硬件時鐘有問題時會影響其頻率,沒有驗證過)。
CLOCK_BOOTTIME: 與CLOCK_MONOTONIC類似
CLOCK_REALTIME_ALARM    : 鬧鐘時間(應該休眠後繼續計時,沒驗證過),系統實時時間,從Epoch計時,可被設置更改。
CLOCK_BOOTTIME_ALARM: 鬧鐘時間(應該休眠後繼續計時,沒驗證過),系統運行時間,從系統啓動時開始計時。
CLOCK_TAI: 原子鐘的時間,與CLOCK_REALTIME類似,不可被更改,沒有閏秒。

struct timespec:
struct timespec
{
time_t tv_sec; //秒
long tv_nsec; //納秒
};

 

在Linux內核中,我們可以發現主要有這麼幾種不同類型的時鐘(clock):

1

2

3

4

CLOCK_REALTIME

CLOCK_MONOTONIC

CLOCK_MONOTONIC_RAW

CLOCK_BOOTTIME

 CLOCK_REALTIME,可以理解爲wall time,即是實際的時間。用戶可以使用命令(date)或是系統調用去修改。如果使用了NTP, 也會被NTP修改。當系統休眠(suspend)時,仍然會運行的(系統恢復時,kernel去作補償)。

CLOCK_MONTONIC,是單調時間,即從某個時間點開始到現在過去的時間。用戶不能修改這個時間,但是當系統進入休眠(suspend)時,CLOCK_MONOTONIC是不會增加的。

CLOCK_MONOTONIC_RAW,和CLOCK_MONOTONIC類似,但不同之處是MONOTONIC_RAW不會受到NTP的影響。CLOCK_MONOTONIC會受到NTP的影響並不是說NTP會去修改CLOCK_MONOTONIC,使其不連續,而是說當NTP server 和本地的時鐘硬件之間有問題,NTP會影響到CLOCK_MONOTONIC的頻率,但是MONOTONIC_RAW則不會受其影響。 其區別可以參考 Difference between MONOTONIC and MONOTONIC_RAW

CLOCK_BOOTTIME,與CLOCK_MONOTONIC類似,但是當suspend時,會依然增加。可以參考LWN的這篇文章 introduce CLOCK_BOOTTIME

--------------------- 
轉自:https://blog.csdn.net/lang523493505/article/details/90043636 

https://www.cnblogs.com/memo-store/p/5658277.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章