Linux clock_gettime(CLOCK_MONOTONIC) странное немонотонное поведение
Народ, в моем приложении я использую clock_gettime(CLOCK_MONOTONIC)
чтобы измерить дельта время между кадрами (типичный подход в gamedev) и время от времени я сталкиваюсь со странным поведением clock_gettime(..)
- возвращаемые значения иногда не являются монотонными (т. е. прежнее время больше текущего времени).
В настоящее время, если такой парадокс случается, я просто пропускаю текущий кадр и начинаю обработку следующего.
Вопрос в том, как это вообще возможно? Это ошибка в реализации Linux POSIX clock_gettime
? Я использую Ubuntu Server Edition 10.04 (ядро 2.6.32-24, x86_64), gcc-4.4.3.
5 ответов
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 и некоторым конкретным процессором Itanium. Мы не могли воспроизвести его с другим процессором в той же ОС. Это было исправлено в 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 (?). Вам стоит это увидеть.
Конечно, звучит как ошибка для меня. Возможно, вы должны сообщить об этом в баг-трекер Ubuntu.
Это ошибка Linux. Никакая регулировка в монотонных часах не может заставить их вернуться назад. Вы используете очень старое ядро и очень старый дистрибутив.
Изменить: вы уверены, что вам нужно пропустить кадр? Если вы снова вызовете clock_gettime, что произойдет?