2015-03-20 40 views
10

Ho letto questa risposta da qualche parte, ma non capisco esattamente:Come funziona l'orologio in Windows 7?

Capisco di Windows incrementa l'orologio ogni curTimeIncrement (156001 100 nanosecondi) con il valore di curTimeAdjustment (156001 + - N). Ma quando l'orologio viene letto utilizzando GetSystemTime la routine interpola nell'intervallo 156001 nanosecondo * 100 a produce la precisione indicata?

Qualcuno può provare a spiegarmelo?

Che cos'è curTimeIncrement, curTimeAdjustment e in che modo Windows può eseguire questa operazione?

Qual è l'effetto per ottenere l'ora esatta?

È vero solo per Windows 7 o anche altri sistemi operativi Win8, Linux, eccetera?

risposta

27

Si riferisce ai valori restituiti da GetSystemTimeAdjustment() su Windows. Ti dice come viene regolato l'orologio per raggiungere o rallentare per abbinare il tempo reale. "Reale" essendo il tempo di un'istituzione come il NIST negli Stati Uniti, ha un orologio atomico la cui accuratezza è molto, molto più alta dell'orologio incorporato nella macchina.

L'orologio in tempo reale (RTC) nella vostra macchina ha una precisione limitata, un effetto collaterale di mantenere l'hardware a prezzi accessibili, tende a essere spento di pochi secondi ogni mese. Quindi periodicamente il sistema operativo contatta un server orario tramite Internet, time.windows.com è la selezione comune su Windows. Il che indica il tempo reale corrente in base all'oracolo dell'orologio atomico.

L'inesattezza dell'RTC non è l'unica fonte di deriva, a volte il tempo reale viene modificato intenzionalmente. Aggiunta di un secondo intercalare per risincronizzare gli orologi con la rotazione effettiva della Terra. Il giorno corrente (24 x 60 x 60 secondi) è un po 'troppo breve, la rotazione della Terra sta rallentando di ~ 1,5 msec ogni secolo ed è in generale irregolare a causa di grandi tempeste e terremoti. Il secondo intercalare secondo lo compensa. Il più recente è stato aggiunto il 30 giugno di quest'anno alle 23:59:60 UTC. 60 non è un errore di battitura :)

Quello precedente era il 30 giugno 2012. Un po 'famigerato, l'inserimento del secondo intercalante ha fatto crashare molti server Linux. Google "Linux leap second bug" per saperne di più.

Quale è in generale ciò che la macchina sotto GetSystemTimeAdjustment() sta cercando di evitare, la modifica istantanea dell'ora con il valore ottenuto dal time server è molto pericolosa. Il software spesso presuppone che il tempo progredisca costantemente e si comporti in modo anomalo quando ciò non avviene. Come osservare lo stesso tempo due volte quando l'orologio è arretrato. O osservando un tempo falso come 23:59:60 UTC a causa del secondo inserimento intercalare.

In caso contrario, l'orologio viene aggiornato 64 volte al secondo, all'interruzione dell'orologio. O in altre parole 1/64 = 0,015625 tra tick, 156250 in nanosecondi * 100 unità. Se è necessario effettuare una regolazione dell'orologio, non aggiunge solo 156250 ma leggermente più o meno. Così lentamente risincronizzando l'orologio al tempo reale ed evitando il software sconvolgente.

Questo ovviamente ha uno spiacevole effetto collaterale sul software che dipinge un orologio. Un modo ovvio per farlo è usare un timer di un secondo. Ma a volte non è un secondo, non lo sarà quando è in corso una regolazione temporale.Quindi entra in gioco il teorema di campionamento di Nyquist, a volte un tick del timer non aggiorna l'orologio o salta un secondo. Notevole è che questo non è il solo motivo per cui è difficile mantenere un orologio verniciato preciso, anche la notifica del timer è sempre ritardata. Un effetto collaterale del software non è in grado di eseguire all'istante. Questa è infatti la fonte più probabile di problemi, la regolazione dell'orologio è solo una ciliegina sulla torta che è più facile da capire.

Problema imbarazzante, Mr. Nyquist ci ha insegnato che è necessario campionare più frequentemente per eliminare gli effetti di aliasing indesiderati. Quindi una soluzione alternativa è impostare il timer su un intervallo ridotto, ad esempio 15 o 31 millisecondi, abbastanza breve perché l'utente non possa più osservare l'aggiornamento mancante.

+0

Hmmm. Ciò significa che se il software sta elaborando musica, non è possibile fare affidamento sull'orologio di sistema (un professionista potrebbe sentire un cambiamento di tempo). Probabilmente la musica non è l'unico dominio sensibile al cambio di velocità, ma non è sensibile ad un errore di secondo per mese. – 18446744073709551615

+1

Certo, è per questo che è fatto in hardware. La tua scheda audio (chip in questi giorni) si prende cura di esso con il proprio orologio. Non è regolato, deve solo essere stabile, non preciso. –