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 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 مرة أخرى ، ماذا يحدث؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top