2017-09-07 35 views
0

我編寫了一個簡單的程序來確定我的系統是RHEL 5.5 VM(內核2.6.18-194)上的納秒精度。CLOCK_REALTIME內核中的納秒級精度支持

// cc -g -Wall ntime.c -o ntime -lrt 
#include <inttypes.h> 
#include <stdint.h> 
#include <stdio.h> 
#include <time.h> 
#include <unistd.h> 
#include <stdlib.h> 

int main(int argc, char* argv[]) { 
    struct timespec spec; 

    printf("CLOCK_REALTIME - \"Systemwide realtime clock.\":\n"); 
    clock_getres(CLOCK_REALTIME, &spec); 
    printf("\tprecision: %ldns\n", spec.tv_nsec); 
    clock_gettime(CLOCK_REALTIME, &spec); 
    printf("\tvalue : %010ld.%-ld\n", spec.tv_sec, spec.tv_nsec); 

    printf("CLOCK_MONOTONIC - \"Represents monotonic time. Cannot be set.\":\n"); 
    clock_getres(CLOCK_MONOTONIC, &spec); 
    printf("\tprecision: %ldns\n", spec.tv_nsec); 
    clock_gettime(CLOCK_MONOTONIC, &spec); 
    printf("\tvalue : %010ld.%-ld\n", spec.tv_sec, spec.tv_nsec); 

    return 0; 
} 

輸出示例:

CLOCK_REALTIME - "Systemwide realtime clock.": 
     precision: 999848ns 
     value : 1504781052.328111000 
CLOCK_MONOTONIC - "Represents monotonic time. Cannot be set.": 
     precision: 999848ns 
     value : 0026159205.299686941 

所以REALTIME給我的本地時間和MONOTONIC系統的正常運行時間。兩個時鐘似乎都有μs的精確度(999848ns×1ms),即使在納秒內輸出MONOTONIC,這也是令人困惑的。

man clock_gettime狀態:

CLOCK_REALTIME_HR CLOCK_REALTIME的高分辨率版本。

然而,grep -R CLOCK_REALTIME_HR /usr/include/ | wc -l回報0,並試圖編譯error: ‘CLOCK_REALTIME_HR’ undeclared (first use in this function)結果。

我試圖確定我是否可以以毫微秒的精度獲取本地時間,但是我的代碼有一個錯誤,或者這個功能在5.5中不完全支持(或者虛擬機的HPET關閉,或其他) 。

可以我在本系統中獲得本地時間(納秒)嗎?我究竟做錯了什麼?

編輯

那麼答案似乎是第

雖然可以達到納秒的精度,系統並不能保證在這種情況下精確到納秒(這裏的差別清晰answer而比咆哮)。典型的COTS硬件並沒有真正處理它(另一個answer在正確的方向)。

我仍然好奇爲什麼時鐘報告相同的clock_getres分辨率,但MONOTONIC產生什麼似乎是納秒值,而REALTIME產生微秒。

+1

在Linux中幾乎沒有微秒的精度,明確地說不是納秒!也許你混淆精度和分辨率? **很**不同的東西!這味道很像XY問題。爲什麼你想要得到ns分辨率呢? – Olaf

+1

精確度很容易,精確度不高。 –

+0

'我可以在這個系統中獲得納秒級的本地時間嗎?'系統中的哪個位置?移動這樣的值(例如,從內核調用中返回)會使其失效。 –

回答

-1

RHEL5在這一點上真的很古老,你應該考慮升級。在較新的系統(Ubuntu 16.04)上,您的程序會生成:

CLOCK_REALTIME - "Systemwide realtime clock.": 
    precision: 1ns 
    value : 1504783164.686220185 
CLOCK_MONOTONIC - "Represents monotonic time. Cannot be set.": 
    precision: 1ns 
    value : 0000537257.257923964 
+0

時鐘分辨率取決於硬件。這些天,CPU中經常有一個定時器。 – stark

相關問題