Comment est la microseconde de linux gettimeofday() a obtenu et ce qui est sa précision?
Temps horloge murale est généralement fourni par les systèmes de RTC. La plupart du temps cela ne fournit des temps de l'ordre de la milliseconde et a généralement une granulométrie de 10 à 20 millisecondes. Cependant, la résolution ou de la granularité de gettimeofday() est souvent signalé pour être dans les quelques microsecondes gamme. Je suppose que la microseconde granularité doit être prise à partir d'une source différente.
Comment est la microseconde résolution/granularité de gettimeofday() accompli?
Lorsque la partie à l'ordre de la milliseconde est prise à partir de la CCF et le mircoseconds sont prises à partir d'un matériel différent, un problème avec la suppression progressive de ces deux sources se pose. Les deux sources doivent être synchronized
en quelque sorte.
Comment est la synchronisation et la suppression progressive entre ces deux sources accompli?
Edit: De ce que j'ai lu dans les liens fournis par amdn, notamment les suivantes Intel lien, je voudrais ajouter une question ici:
Ne gettimeofday()
fournir la résolution/précision dans la microseconde régime?
Edit 2: résumé de l'amdns réponse avec un peu plus de résultats de lecture:
Linux n'utilise l'horloge en temps réel (RTC) au moment du démarrage
pour synchroniser avec une résolution plus élevée compteur, j'.g. le Timestampcounter (TSC). Après le démarrage gettimeofday()
retourne un temps qui est entièrement basé sur la TSC de la valeur et de la fréquence de ce compteur. La valeur initiale de la TSC frequency
est corrigé/calibrées par des moyens de comparaison de l'heure du système à une source de temps externe. L'ajustement est effectué/configuré par l' adjtimex() fonction. Le noyau gère une boucle à verrouillage de phase pour s'assurer que le temps les résultats sont monotone et uniforme.
De cette manière, il peut être indiqué que gettimeofday()
a la microseconde résolution. Tenant compte du fait que plus moderne Timestampcounter sont en cours d'exécution dans le GHz régime, le obtenir la résolution pourrait être de l'ordre de la nanoseconde régime. Par conséquent, cette significatif commentaire
/**
407 * do_gettimeofday - Returns the time of day in a timeval
408 * @tv: pointer to the timeval to be set
409 *
410 * NOTE: Users should be converted to using getnstimeofday()
411 */
peut être trouvé dans Linux/kernel/temps/de chronométrage.c. Cela suggère qu'il y aura éventuellement
une résolution encore plus élevée de la fonction disponible à une date ultérieure. Maintenant getnstimeofday()
est uniquement disponible dans l'espace du noyau.
Cependant, en regardant à travers tout le code pour obtenir ce sur la droite, montre assez peu de commentaires sur les incertitudes. Il peut être possible d'obtenir une résolution. La fonction gettimeofday()
peut même montrer une granularité dans la microseconde régime. Mais: Il existe de graves daubts quant à la précision, car le drift
de la TSC de fréquence ne peut pas être exactement corrigée pour. Aussi la complexité du code de traiter cette question à l'intérieur de Linux est un indice de croire qu'il en fait trop difficile d'obtenir ce droit. Ceci est particulièrement, mais pas uniquement causé par le grand nombre de plates-formes Linux est censé fonctionner sur.
Résultat: gettimeofday()
retourne monotone temps avec une granularité, mais le temps qu'elle fournit est presque jamais est la phase de one microsecond
avec toute autre source de temps.
- À la fin de la journée, le granuality dépend du matériel utilisé.Je voudrais juste prendre l'aide de 100ms pour les algorithmes. Cela est dû à la prise en compte de la commutation de contexte etc.
Vous devez vous connecter pour publier un commentaire.
Comment est la microseconde résolution/granularité de gettimeofday() accompli?
Linux fonctionne sur de nombreuses plates-formes matérielles, de sorte que les détails diffèrent. Sur moderne, une plate-forme x86 Linux utilise la Time Stamp Counter, aussi connu comme le
TSC
, qui est entraînée par des multiples d'un oscillateur à quartz fonctionnant à 133.33 MHz. L'oscillateur à cristal fournit une référence d'horloge du processeur et le processeur multiplie par certains multiples - par exemple sur un 2.93 GHz processeur le multiple est de 22. LeTSC
, historiquement, a été une source fiable de temps parce que les implémentations pourrait arrêter le compteur lorsque le processeur est allé dormir, ou parce que le multiple n'était pas constant que le processeur décalé multiplicateurs de changer les états de performance ou de ralentir quand il faisait chaud. Les processeurs x86 modernes offrent uneTSC
qui est constante, invariant, et non-stop. Sur ces processeurs, l'TSC
est un super haute résolution de l'horloge et le noyau Linux et détermine une première fréquence approximative au moment du démarrage. LeTSC
fournit une résolution pour la gettimeofday() de l'appel système et de l'ordre de la nanoseconde résolution pour la clock_gettime() de l'appel système.Comment est cette synchronisation accompli?
Votre première question a été de savoir comment le Linux de l'horloge offre une haute résolution, cette deuxième question est à propos de la synchronisation, c'est la distinction entre la précision et l'exactitude. La plupart des systèmes ont une horloge sauvegardée par pile pour le garder le temps de la journée lorsque le système est sous tension. Comme vous vous en doutez cette horloge n'a pas élevé d'exactitude et de précision, mais il recevra l'heure de la journée "dans le stade" lorsque le système démarre. Pour obtenir la précision la plupart des systèmes utilisent un composant facultatif pour obtenir du temps à partir d'une source externe sur le réseau. Les deux plus courantes sont les
Ces protocoles définissent une horloge maître sur le réseau (ou un niveau de horloges fournies par une horloge atomique), puis mesurer les latences réseau pour estimer les décalages de l'horloge maître. Une fois le décalage entre le maître est déterminé que l'horloge système est
disciplined
de tenir à jour. Cela peut être fait parSlewing
de l'horloge (définie comme la façon dont beaucoup de la fréquence de l'horloge doit être réglée par lentement en augmentant ou en diminuant la fréquence sur une période de temps donnée)Le noyau fournit la adjtimex appel système pour permettre à l'horloge de la discipline. Pour plus de détails sur la façon moderne Intel processeurs multi-core garder le TSC synchronisées entre les cœurs voir CPU TSC opération d'extraction en particulier dans le multicœur multi-processeur de l'environnement.
Pertinentes noyau des fichiers source pour les réglages de l'horloge sont noyau/heure.c et noyau/temps/de chronométrage.c.
gettimeofday()
utilise également le CCF de synchronisation. Ainsi, il semble y avoir deux sources, le CCF et le TSC. Ma question était sur la synchronisation de ces deux sources. En particulier dans la TSC fréquence semble pertinent ici, parce que la génération de matériel a certainement quelques tolérances et un écart de seulement 10 ppm provoque une erreur de 10 microsecondes/seconde. Donc une deuxième donnée par le CCF peut correspondre à 1.000010 s donnée par le TSC.slew
la fréquence au cours du temps.timekeeping.c
quegettimeofday()
est soutenu pargetnstimeofday()
ce qui implique que le CCF est jamais consulté après l'initialisation du système. Donc le résultat degettimeofday()
est purement dérivé par le TSC et ne doit pas être comparé à RTC résultats. En conséquence, il peut dérive, mais a la microseconde granularité. Est ce que c'est?slew
l'horloge au fil du temps afin de le synchroniser, à moins que le NTP (ou PTP ou un autre processus à l'aide de adjtimex) est utilisé, dans ce cas qui l'emporte... mais c'est de la spéculation de ma part. À moins d'un expert dans cette partie du noyau contribue à notre prochaine étape sera d'étudier les sources du noyau, j'ai fourni deux liens dans la réponse ci-dessus. Je vais essayer de vous donner une réponse définitive ce soir.Quand Linux démarre, il initialise le logiciel de l'horloge à l'aide de l'horloge matérielle. Voir le chapitre Comment Linux de garder une Trace de dans le Horloge HOWTO.
gettimeofday()
? C'était ce que les questions ont été tout au sujet.