Como é obtido o tempo de microssegundo do linux gettimeofday () e qual a sua precisão?

A hora do relógio de parede é geralmente fornecida pelos sistemas RTC. Isso geralmente fornece apenas o tempo até o intervalo de milissegundos e normalmente tem uma granularidade de 10 a 20 milissegundos. No entanto, a resolução / granularidadegettimeofday () é frequenterelatadoestar no intervalo de poucos microssegundos. Suponho que a granularidade de microssegundos deve ser obtida de uma fonte diferente.

Como a resolução / granularidade em microssegundos de gettimeofday () é atingida?

Quando a parte até o milissegundo é retirada do RTC e os mircosegundos são retirados de um hardware diferente, surge um problema de faseamento das duas fontes. As duas fontes têm que sersynchronized de alguma forma.

Como a sincronização / faseamento entre essas duas fontes é realizada?

Editar: Pelo que eu li nos links fornecidos pela amdn, particularmente os seguintesIntel link, gostaria de acrescentar uma pergunta aqui:

Fazgettimeofday() fornecer resolução / granularidade no microssegundo regime de todo?

Editar 2: Resumindo as amdnsresponda com mais alguns resultados de leitura:

O Linux usa apenas o relógio em tempo real (RTC) no momento da inicialização para sincronizar com um contador de resolução mais alta, i.g. o Timestampcounter (TSC). Depois do bootgettimeofday() retorna um tempo que é inteiramente baseado no valor do TSC e na frequência deste contador. O valor inicial para o TSCfrequency é corrigido / calibrado por meio da comparação da hora do sistema com uma fonte de tempo externa. O ajuste é feito / configurado peloadjtimex () função. O kernel opera um loop de bloqueio de fase para garantir que os resultados de tempo sejam monótonos e consistentes.

Desta forma, pode-se afirmar quegettimeofday() tem resolução de microssegundos. Levando em conta que o Timestampcounter mais moderno está executando no regime de GHz, a resolução obtida pode estar no regime de nanossegundos. Portanto, este comentário significativo

/**
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  */

pode ser encontrado emLinux / kernel / time / timekeeping.c. Isso sugere que possivelmente haverá uma função de resolução ainda maior disponível em um momento posterior. Agora mesmogetnstimeofday() está disponível apenas no espaço do kernel.

No entanto, olhando através de todo o código envolvido para fazer isso direito, mostra alguns comentários sobre incertezas. Pode ser possível obter uma resolução de microssegundos. A funçãogettimeofday() pode até mostrar uma granularidade no microssegundo regime.Mas: Há dardos severos sobre a sua precisão porque odrift da freqüência TSC não pode ser corrigido com precisão para. Além disso, a complexidade do código que lida com esse assunto dentro do Linux é uma pista para acreditar que, na verdade, é muito difícil acertar. Isso é particularmente, mas não apenas, causado pelo grande número de plataformas de hardware que o Linux deve rodar.

Resultado: gettimeofday() retorna tempo monotônico com granularidade de microssegundos, mas o tempo que ele fornece quase nunca é fase paraone microsecond com qualquer outra fonte de tempo.

questionAnswers(2)

yourAnswerToTheQuestion