CLOCK_REALTIME поддержка наносекундной точности в ядре

Я написал простую программу, чтобы определить, могу ли я получить наносекундную точность в моей системе, которая является VM RHEL 5.5 (ядро 2.6.18-194).

// 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 (или VM HPET выключен или что-то еще).

Могу ли я получить местное время в наносекундах в этой системе? Что я делаю неправильно?

ИЗМЕНИТЬ

Ну, похоже, ответ №.

В то время как наносекундная точность может быть достигнута, система не гарантирует точность наносекунды в этом сценарии (здесь ясно ответ относительно разницы, а не разглагольствования). Типичное оборудование COTS на самом деле не справляется (другое ответ в правильном направлении).

Мне все еще интересно узнать, почему часы сообщают о том же clock_getres разрешении еще MONOTONIC дает то, что кажется наносекундными значениями, а REALTIME дает микросекунды.

Ответ 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