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.
InformationsquelleAutor Arno | 2012-11-05