Linux clock_gettime(CLOCK_MONOTONIC) странное немонотонное поведение

StackOverflow https://stackoverflow.com/questions/3657289

  •  01-10-2019
  •  | 
  •  

Вопрос

Ребята, в своем приложении я использую clock_gettime(CLOCK_MONOTONIC) чтобы измерить время разности между кадрами (типичный подход в gamedev), и время от времени я сталкиваюсь со странным поведением clock_gettime(..) - возвращаемые значения иногда не являются монотонными (т.е. предыдущими).время это больше чем текущее время).

В настоящее время, если происходит такой парадокс, я просто пропускаю текущий кадр и начинаю обрабатывать следующий.

Вопрос в том, как это вообще возможно?Является ли это ошибкой в реализации Linux POSIX в clock_gettime?Я использую Ubuntu Server версии 10.04 (ядро 2.6.32-24, x86_64), gcc-4.4.3.

Это было полезно?

Решение

man clock_gettime говорит:

Clock_Monotonic_raw. (поскольку Linux 2.6.28; Linux-специфичный)

Подобно Clock_Monotonic, но обеспечивает доступ к быстрому аппаратному времени, которое не подлежит настройкам NTP.

С CLOCK_MONOTONIC_RAW не является предметом регулировков NTP, я думаю, CLOCK_MONOTONIC может быть.

У нас были похожие проблемы с Redhat Enterprise 5.0 с 2,6,18 ядром и некоторым конкретным процессором итанием. Мы не могли воспроизвести его с другим процессором на той же ОС. Он был зафиксирован в RHEL 5.3 с чуть более новым ядром и некоторыми патчами Redhat.

Другие советы

Выглядит как экземпляр

commit 0696b711e4be45fa104c12329f617beb29c03f78
Author: Lin Ming <ming.m.lin@intel.com>
Date:   Tue Nov 17 13:49:50 2009 +0800

timekeeping: Fix clock_gettime vsyscall time warp

Since commit 0a544198 "timekeeping: Move NTP adjusted clock
multiplier to struct timekeeper" the clock multiplier of vsyscall is updated with
the unmodified clock multiplier of the clock source and not with the
NTP adjusted multiplier of the timekeeper.

This causes user space observerable time warps:
new CLOCK-warp maximum: 120 nsecs,  00000025c337c537 -> 00000025c337c4bf

Видеть здесь для патча. Это было включено в 2,6,32,19, но, возможно, не было привержено командой Debian (?). Вам стоит это увидеть.

Пытаться CLOCK_MONOTONIC_RAW.

Конечно, звучит как ошибка для меня. Возможно, вы должны сообщить об этом в Ошибка Ubuntu Tracker.

Это ошибка в Linux.Никакая настройка в монотонных часах не может заставить их идти вспять.Вы используете очень старое ядро и очень старый дистрибутив.

Редактировать:вы уверены , что вам нужно пропустить этот кадр ?Если вы снова вызовете clock_gettime, что произойдет?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top