#linux #time #clock #system-calls
#linux #время #часы #системные вызовы
Вопрос:
У меня возникли трудности с различными часами, к которым может быть получен доступ clock_gettime
. Особенно меня интересует:
CLOCK_REALTIME
CLOCK_PROCESS_CPUTIME_ID
CLOCK_THREAD_COUTIME_ID
Я прочитал manpage, но это мне не очень помогло. Я использую clock_gettime
для генерации временных меток для моего профилировщика, когда он отправляет собранные данные через сокет. Я заметил следующие различия:
CLOCK_REALTIME
События, которые я получаю от моего профилировщика с помощью этих часов, иногда располагаются в неправильном порядке. Временные метки начинаются с более высокого значения, хотя и не намного выше. Часто первыми появляются последние сообщения (с более высокой временной меткой), а позже временные метки с меньшим значением.
CLOCK_PROCESS_CPUTIME_ID
CLOCK_THREAD_COUTIME_ID
Я не нашел разницы на обоих часах, хотя они начинаются с меньшего значения и всегда правильно упорядочены.
Я не могу объяснить это поведение.
Ответ №1:
Вероятно, в вашем системном источнике часов установлено значение 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
Дальнейшее чтение:
Ответ №2:
CLOCK_REALTIME
предоставляет вам доступ к часам реального времени, то есть к тем, которые хранят текущую дату и время.CLOCK_MONOTONIC
предоставляет вам доступ к часам, которые никогда не возвращаются назад во времени, вам, вероятно, следует использовать это вместоCLOCK_REALTIME
.CLOCK_PROCESS_CPUTIME_ID
предоставляет вам доступ к часам, специфичным для текущего процесса, предоставляя вам время процессора процесса (время, затраченное процессором на выполнение этого конкретного процесса).CLOCK_THREAD_CPUTIME_ID
предоставляет вам доступ к часам, специфичным для текущего потока, предоставляя вам время процессора процесса (время, затраченное процессором на выполнение этого конкретного потока).
Комментарии:
1. Могу ли я предположить, что CLOCK_REALTIME сброшен? Это единственное объяснение, которое у меня есть для неправильного порядка, который я получаю с этими часами.
2. В Linux CLOCK_REALTIME и CLOCK_MONOTONIC оба подвержены разрывам из-за настройки системного времени, например, с помощью ntpd. Используйте CLOCK_MONOTONIC_RAW, чтобы получить таймер, который на самом деле гарантированно не пойдет назад во времени.
3. @BDatRivenhill 1 полезно для устранения моей проблемы с истекшим временем