Как часы работают в Windows 7?

Я прочитал этот ответ где-то, но я не понимаю его точно:

Я понимаю, что Windows увеличивает часы каждый раз в секунду (156001 100 наносекунд) со значением коррекции curTime (156001) + - N). Но когда часы считываются с использованием GetSystemTime, рутинная интерполяция в интервале 156001 наносекунд * 100 вывести указанную точность?

Может кто-нибудь попытается объяснить это мне?

Что такое curTimeIncrement, curTimeAdjustment и как Windows может это сделать?

Каков эффект для получения точного времени?

Это правда только для Windows 7 или других ОС Win8, Linux и т.д.?

Ответ 1

Он ссылается на значения, возвращаемые GetSystemTimeAdjustment() в Windows. Он сообщает вам, как настроить часы, чтобы догнать или замедлить, чтобы соответствовать реальному времени. "Реальный" - время, проведенное институтом, таким как NIST в США, у них есть атомные часы, точность которых намного выше, чем часы, встроенные в вашу машину.

Часы реального времени (RTC) на вашем компьютере имеют ограниченную точность, побочный эффект от доступности аппаратного обеспечения, который, как правило, отключается на несколько секунд каждый месяц. Поэтому периодически операционная система контактирует с сервером времени через Интернет, time.windows.com - это общий выбор в Windows. Это говорит о текущем реальном времени в соответствии с оракулом атомных часов.

Неточность RTC не является единственным источником дрейфа, иногда реальное время изменяется намеренно. Добавление секунды прыжка для повторной синхронизации часов с истинным вращением Земли. Текущий день (24 x 60 x 60 секунд) немного короче, вращение Земли замедляется на ~ 1,5 мсек в каждом столетии и в целом нерегулярно из-за крупных штормов и землетрясений. Вложенные секунды прыжка компенсируют это. Последний был добавлен 30 июня этого года в 23:59:60 UTC. 60 не опечатка:)

До этого было 30 июня 2012 года. Немного пресловутый, вставка второго прыжка разбила много серверов Linux. Google "Linux перескакивает вторую ошибку", чтобы узнать больше об этом.

В общем, то, что избегает механизм под GetSystemTimeAdjustment(), мгновенно меняет время со значением, полученным с сервера времени, очень опасно. Программное обеспечение часто имеет твердое предположение, что время прогрессирует неуклонно и неправильно, когда это не так. Подобно наблюдению в то же время дважды, когда часы установлены назад. Или соблюдение поддельного времени, как 23:59:60 UTC из-за второй вставки прыжка.

Таким образом, это не так, часы обновляются 64 раза в секунду при прерывании тактового сигнала. Или, другими словами, 1/64 = 0,015625 между тиками, 156250 в наносекундах * 100 единиц. Если необходимо выполнить настройку часов, это не просто добавляет 156250, но немного больше или меньше. Таким образом, медленная синхронизация часов с истинным временем и предотвращение опрокидывания программного обеспечения.

Это, конечно, имеет неприятный побочный эффект на программное обеспечение, которое рисует часы. Очевидный способ сделать это - использовать таймер в одну секунду. Но иногда это не секунда, это не будет, когда идет корректировка времени. Затем вступает в игру теорема выборки Найквиста, иногда таймер не обновляет часы вообще или пропускает секунду. Примечательно, что это не единственная причина, по которой трудно точно настроить окрашенные часы, а также таймерное оповещение всегда задерживается. Побочное действие программного обеспечения не может мгновенно выполнить. Это на самом деле гораздо более вероятный источник проблем, настройка часов - это просто обледенение на торт, который легче понять.

Неловкая проблема, г-н Найквист научил нас, что вам нужно чаще выбирать, чтобы устранить нежелательные эффекты наложения. Поэтому обходным путем является просто установить таймер с небольшим интервалом, например 15 или 31 миллисекунды, достаточно коротким, чтобы пользователь больше не наблюдал отсутствующее обновление.