Linux clock_gettime (clock_monotonic) سلوك غريب غير متجانس
سؤال
الناس ، في طلبي أنا أستخدمه clock_gettime(CLOCK_MONOTONIC)
من أجل قياس وقت الدلتا بين الإطارات (نهج نموذجي في Gamedev) ومن وقت لآخر ، أواجه سلوكًا غريبًا clock_gettime(..)
- القيم التي تم إرجاعها في بعض الأحيان ليست رتيبة (أي الوقت السابق أكبر من الوقت الحالي).
حاليًا ، إذا حدث مثل هذه المفارقة ، فأنا ببساطة أتخطى الإطار الحالي والبدء في معالجة الإطار التالي.
السؤال هو كيف يمكن أن يكون هذا ممكنًا على الإطلاق؟ هل هو خطأ في تنفيذ Linux Posix لـ clock_gettime
؟ أنا أستخدم Ubuntu Server Edition 10.04 (kernel 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 مع kernel 2.6.18 وبعض معالج itanium محدد. لم نتمكن من إعادة إنتاجه مع معالج آخر على نفس نظام التشغيل. تم إصلاحه في RHEL 5.3 مع kernel الأحدث قليلاً وبعض بقع 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
.
بالتأكيد يبدو وكأنه خطأ بالنسبة لي. ربما يجب عليك الإبلاغ عنها متتبع الأخطاء في أوبونتو.
إنه خطأ Linux. لا يمكن أن تجعل أي justment في ساعة رتابة العودة إلى الوراء. أنت تستخدم نواة قديمة جدًا وتوزيع قديم جدًا.
تحرير: هل أنت متأكد من أنك بحاجة إلى تخطي الإطار؟ إذا قمت بالاتصال بـ clock_gettime مرة أخرى ، ماذا يحدث؟