linux 時間戳 單調遞增時間(CLOCK_MONOTONIC_RAW)

轉載地址

https://blog.csdn.net/zniahfag/article/details/53489970

https://www.jianshu.com/p/1861a844a2fb

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

 

uint64_t ustime(void) {

   uint64_t ust=0;
//     struct timeval tv;
//    gettimeofday(&tv, NULL);
//    ust = ((uint64_t)tv.tv_sec)*1000000;
//    ust += (uint64_t)tv.tv_usec;

    struct timespec tp;

    if(syscall(SYS_clock_gettime, CLOCK_MONOTONIC_RAW, &tp)==0)
    {
        ust=(uint64_t)(tp.tv_sec*1000000);
        ust += (uint64_t)(tp.tv_nsec/1000);

    }


    return ust;
}

/* Return the  time in milliseconds */
uint64_t mstime(void) {
    return ustime()/1000;
}

CLOCK_MONOTONIC_RAW替代 gettimeofday(CLOCK_REALTIME)獲得ms時間戳

 

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

1

2

3

4

CLOCK_REALTIME

CLOCK_MONOTONIC

CLOCK_MONOTONIC_RAW

CLOCK_BOOTTIME

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

相對時間,從1970.1.1到目前的時間。更改系統時間會更改獲取的值。它以系統時間爲座標。
字面意思: wall time掛鐘時間,表示現實的時間,由變量xtime來記錄的。
系統每次啓動時,將CMOS上的RTC時間讀入xtime,這個值是”自1970-01-01起經歷的秒數、本秒中經歷的納秒數”。每來一個timer interrupt,也需要去更新xtime。
wall time不一定是單調遞增的。因爲wall time是指現實中的實際時間,如果系統要與網絡中某個節點時間同步、或者由系統管理員覺得這個wall time與現實時間不一致,有可能任意的改變這個wall time。
最簡單的例子是,用戶本身可以去任意修改系統時間,這個被修改的時間應該就是wall time,即xtime,它甚至可以被寫入RTC而永久保存。

一些應用軟件可能就是用到了這個wall time。比如以前用vmware workstation,一啓動提示試用期已過,但是隻要把系統時間調整一下提前一年,再啓動就不會有提示了。這很可能就是因爲它啓動時,用gettimeofday去讀wall time,然後判斷是否過期,只要將wall time改一下,就可以欺騙過去了。

 

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

以絕對時間爲準,獲取的時間爲系統重啓到現在的時間,更改系統時間對它沒有影響。
字面意義:單調時間,表示系統啓動後流逝的時間,由變量jiffies來記錄的。
系統每次啓動時,jiffies初始化爲0。每來一個timer interrupt,jiffies加1,即它代表系統啓動後流逝的tick數。
jiffies一定是單調遞增的,因爲時間不可逆。

 

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

4 CLOCK_BOOTTIME,與CLOCK_MONOTONIC類似,但是當suspend時,會依然增加。可以參考LWN的這篇文章 introduce https://lwn.net/Articles/420142/

 

 

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