web-dev-qa-db-ja.com

Linux clock_gettime(CLOCK_MONOTONIC)奇妙な非単調な振る舞い

皆さん、私のアプリケーションでは、フレーム間のデルタ時間を測定するためにclock_gettime(CLOCK_MONOTONIC)を使用しており(gamedevの一般的なアプローチ)、時々clock_gettime(..)の奇妙な動作に直面しています。 -戻り値が単調でない場合があります(つまり、前の時間現在の時間よりも大きい)。

現在、このようなパラドックスが発生した場合は、現在のフレームをスキップして次のフレームの処理を開始します。

問題は、どうすればこれが可能になるのかということです。 clock_gettimeのLinuxPOSIX実装のバグですか? Ubuntu Server Edition 10.04(カーネル2.6.32-24、x86_64)、gcc-4.4.3を使用しています。

27
pachanga

man clock_gettime言う:

CLOCK_MONOTONIC_RAW(Linux2.6.28以降; Linux固有)

CLOCK_MONOTONICに似ていますが、NTP調整の対象とならない生のハードウェアベースの時間へのアクセスを提供します。

CLOCK_MONOTONIC_RAWはNTP調整の対象ではありません、私はCLOCK_MONOTONIC になり得る。

2.6.18カーネルといくつかの特定のItaniumプロセッサを搭載したRedhatEnterprise5.0でも同様の問題が発生しました。同じOS上の他のプロセッサでそれを再現することはできませんでした。 RHEL 5.3で修正され、わずかに新しいカーネルといくつかのRedhatパッチが適用されました。

22
Dmitry Yudakov

のインスタンスのように見えます

commit 0696b711e4be45fa104c12329f617beb29c03f78
Author: Lin Ming <[email protected]>
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チーム(?)によってバックポートされていない可能性があります。あなたはそれをチェックする必要があります。

21

CLOCK_MONOTONIC_RAWをお試しください。

6
Matt Joiner

確かに私にはバグのように聞こえます。おそらくあなたはそれを buntuのバグトラッカー で報告するべきです。

4
caf

これはLinuxのバグです。単調な時計を調整しても、逆方向に進むことはできません。非常に古いカーネルと非常に古いディストリビューションを使用しています。

編集:フレームをスキップする必要がありますか? clock_gettimeを再度呼び出すと、どうなりますか?

0
hdante