Linux clock_gettime(CLOCK_MONOTONIC) bizarre non monotone comportement
Les gens, dans mon application j'utilise clock_gettime(CLOCK_MONOTONIC)
afin de mesurer la différence de temps entre les trames (une approche typique de gamedev) et de temps en temps, je suis confronté à un étrange comportement de clock_gettime(..)
- valeurs renvoyées parfois ne sont pas monotone (j'.e prev. temps est plus grand que l'heure actuelle).
Actuellement, si un tel paradoxe qui se passe j'ai tout simplement ignorer l'image en cours et commencer le traitement de la suivante.
La question est de savoir comment cela peut-il être possible? Est-ce un bug sous Linux, POSIX mise en œuvre de clock_gettime
? Je suis sous Ubuntu Server Edition 10.04 (noyau 2.6.32-24, x86_64), gcc-4.4.3.
Nope, pas de virtualisation impliqués
OriginalL'auteur pachanga | 2010-09-07
Vous devez vous connecter pour publier un commentaire.
man clock_gettime
dit:Depuis
CLOCK_MONOTONIC_RAW
n'est pas l'objet de NTP ajustements, je suppose queCLOCK_MONOTONIC
pourrait être.Nous avons eu des problèmes similaires avec Redhat Enterprise 5.0 avec la version 2.6.18 et certaines processeur Itanium. Nous n'avons pas pu le reproduire avec un autre processeur sur le même OS. Il a été fixé dans RHEL 5.3 légèrement plus récente du noyau et certains Redhat patchs.
J'ai travaillé sur le noyau de l'horloge fonctions pendant un certain temps. La façon dont il est censés, c'est que la MONOTONE de l'horloge ne va jamais vers l'arrière. C'est en quelque sorte par définition.
Dans la pratique, MONOTONE est mis en œuvre comme un décalage de temps réel. Tout moment en temps réel l'horloge est réglée, ou si le système est en veille, cette compensation est ajustée. Dans de mauvaises circonstances, le décalage peut être calculé, résultant en un saut-même vers l'arrière un saut-de la MONOTONE de l'horloge.
OP de ne pas mentionner comment les grandes erreurs, mais c'est mon expérience: Le haut-horloge en temps réel dans la plupart des quincailleries ne fournit de temps à la seconde près, alors que Linux permet de maintenir à l'interne le plus proche de la microseconde ou de l'ordre de la nanoseconde. Linux tente de résoudre ces problèmes avant de s'endormir et de se réveiller, mais la logique est assez compliqué et je ne la comprends pas. Ajouter à des ajustements en temps réel causé par le NTP réglages, l'utilisateur ajustements en temps, et qui sait quoi d'autre, et vous avez une recette pour le chaos. Ligne de fond est que je ne suis pas vraiment surpris que MONTONIC va parfois à l'envers.
CLOCK_MONOTONIC n'est pas censé pour sauter vers l'arrière (ou en avant); si elle le fait, que c'est un bug. Il est soumis à des ajustements subtils (qui ressemble à 500 parties par million) par le démon NTP, alors que CLOCK_MONOTONIC_RAW ne l'est pas. Ma compréhension est que la "première" monotone de l'horloge peut ne pas être précis à 100%, de sorte que le démon NTP pouvez l'accélérer ou le ralentir un tout petit peu pour le faire correspondre avec le passage du temps. Si vous voulez faire les choses N fois par seconde, le non-raw horloge est probablement plus exacte.
OriginalL'auteur Dmitry Yudakov
Ressemble à une instance de
Voir ici pour un patch. Ce point a été inclus dans 2.6.32.19, mais ils n'ont pas été réactualisés par l'équipe Debian(?). Vous devriez vérifier.
OriginalL'auteur Michael Foukarakis
Essayer
CLOCK_MONOTONIC_RAW
.OriginalL'auteur Matt Joiner
Sûr sonne comme un bug pour moi. Peut-être vous devriez le signaler dans Ubuntu bug tracker.
C'est tellement triste, tellement vrai...
OriginalL'auteur caf
C'est un linux bug. Aucun ajustement de la dans une monotone horloge, vous pouvez le faire revenir en arrière. Vous êtes à l'aide d'un très ancien noyau et une très vieille distribution de.
Edit: êtes-vous sûr que vous devez ignorer l'image ? Si vous appelez clock_gettime de nouveau, ce qui se passe ?
OriginalL'auteur hdante