Задача: синхронизировать время на двух или более компьютерах, находящихся в локальной сети. Точность синхронизации — порядка 1 миллисекунды. Использовать интернет не обязательно, один из компьютеров может использоваться в качестве эталона. Компьютеры работают под управлением OS Windows (XP или выше), но интересно также кроссплатформенное решение.
Здравствуйте, andrey_nado, Вы писали:
_>Задача: синхронизировать время на двух или более компьютерах, находящихся в локальной сети. Точность синхронизации — порядка 1 миллисекунды. Использовать интернет не обязательно, один из компьютеров может использоваться в качестве эталона. Компьютеры работают под управлением OS Windows (XP или выше), но интересно также кроссплатформенное решение.
_>Кто что подскажет?
Первое, что приходит в голову — поднять в локальной сети свой time server (Network Time Protocol).
Здравствуйте, andrey_nado, Вы писали:
_>Задача: синхронизировать время на двух или более компьютерах, находящихся в локальной сети. Точность синхронизации — порядка 1 миллисекунды. Использовать интернет не обязательно, один из компьютеров может использоваться в качестве эталона. Компьютеры работают под управлением OS Windows (XP или выше), но интересно также кроссплатформенное решение.
Я подскажу, что требование очень жесткое для Windows. Первым делом поставьте ntpd и посмотрите, какую точность обеспечит он. Если повезёт, это будет порядка 2-5 мс. Если не повезёт, то это может быть и 50 мс (что для вас много).
"Не повезёт" может означать к примеру следующее
* Сетевой концентратор вставляет задержки в 2-4 мс при доставке пакета[/li]
* Точность таймера на материнской плате существенно хуже 1 мс
* Исходное время подвержено скачкам в 30 (300, 3000... ) мс, т.к. корректируется бог весть как из интернетов
* CPU на машинах загружен под 100% и из-за этого синхронизация ухудшается
В общем, я не разделяю всеобщего оптимизма. 1мс это очень жёстко для неспециализированного железа с виндой. Зачем собственно такая точность, передаёте какой-нибудь сигнал? Про самосинхронизирующиеся коды слышали? Если у вас задача не реалтаймовая, лучше использовать их, а не долбаться с NTP
Здравствуйте, b-3, Вы писали:
b-3>Зачем собственно такая точность, передаёте какой-нибудь сигнал?
На одном компьютере измеряется некая величина, причём как мгновенное значение, так и первая производная по времени.
На других компьютерах эта величина периодически (раз в секунду) считывается с первого компьютера по HTTP. По получении нужно получить как можно более точное значение измеряемой величины в настоящий момент, а не в момент измерения. Для этого вместе с величиной и её производной передаётся временная отметка, а на компьютере-получателе вычисляется, насколько величина успела измениться.
> Про самосинхронизирующиеся коды слышали?
Здравствуйте, andrey_nado, Вы писали:
b-3>>Зачем собственно такая точность, передаёте какой-нибудь сигнал? _>На других компьютерах эта величина периодически (раз в секунду) считывается с первого компьютера по HTTP. По получении нужно получить как можно более точное значение измеряемой величины в настоящий момент, а не в момент измерения. Для этого вместе с величиной и её производной передаётся временная отметка,
Стоп, стоп. А откуда вы под виндой возьмёте временную отметку с точностью порядка 1мс?
Таймеры под виндой бывают двух видов: использующие кварц часов материнской платы (точная частота, но огрубление значения до 5-10мс) и использующие CPU frequency generator (значение не огрубляется, но погрешность частоты до нескольких процентов). Ни то, ни другое, не позволяет так запросто получить 1 мс метку времени на десктопном железе. У вас есть какая-то заготовка на эту тему?
В принципе можно попробовать поставить ntpd в режиме, когда он отдаёт значения через multimedia timer, но этот режим у него полуэкспериментальный и проблемный... Вот, к примеру история одной из попыток достичь точности в 1 мс. Даёт представление о том, какое это увлекательное дело в нереалтаймовой ОС
Здравствуйте, b-3, Вы писали:
b-3>Стоп, стоп. А откуда вы под виндой возьмёте временную отметку с точностью порядка 1мс?
Мне не нужно производить отсчёты с точным до 1 мс интервалом. Мне достаточно знать текущее время с точностью до 1 мс, когда я делаю измерение. Это возможно под современными версиями Windows?
Если это невозможно, и текущее время определяется с точностью до ~10 мс, то постановка задачи меняется: теперь мне нужно синхронизировать время с точностью до этих самых 10 мс (или сколько там позволяет таймер). Такую точность мне NTP обеспечит?
Здравствуйте, andrey_nado, Вы писали:
_>Здравствуйте, b-3, Вы писали:
b-3>>Стоп, стоп. А откуда вы под виндой возьмёте временную отметку с точностью порядка 1мс?
_>Мне не нужно производить отсчёты с точным до 1 мс интервалом. Мне достаточно знать текущее время с точностью до 1 мс, когда я делаю измерение. Это возможно под современными версиями Windows?
_>Если это невозможно, и текущее время определяется с точностью до ~10 мс, то постановка задачи меняется: теперь мне нужно синхронизировать время с точностью до этих самых 10 мс (или сколько там позволяет таймер). Такую точность мне NTP обеспечит?
5-10 мс добиться можно точно. Призываю вас проэкспериментировать) Что касается 1мс — нужно смотреть последний релиз ntp, там вроде планировались улучшения.
Вот ещё мысль. Если бы мне позарез требовалась 1мс точность в ваших условиях, а со стандартным NTPD/W32time/etc бы ничего не получилось, я бы имел такой запасной вариант:
— посылаем sntp пакет, запуская мультимедиа таймер (Stopwatch в .net, QueryPerformanceTimer в винапи). Пакет простой, в инете есть примеры кода.
— по мультимедиа таймеру отмеряем интервал между отправкой sntp запроса и получением sntp ответа. Результат замера будет типа 5мс, что даёт нам смещение относительно ведущего компьютера с теоретической погрешностью до 2.5 мс из-за несимметричнности канала, но на практике там может быть стабильно лучше 1мс, особенно если соединить напрямую по ethernet
— получение ответного пакета udp, содержащего метку времени, вызывает замер значения. В этот момент, имея свежую метку времени и держась за QueryPerformanceTimer, можно выжать что-то порядка 0.2-0.5 мс. Mission complete
Фокус удаётся из-за того, что вы вообще не синхронизируете системное время, а сращиваете логику получения метки времени и обработки сигнала. Правда это потребует разобраться в формулах ntp, но там несложно, по сути одна арифметика вроде (T4-T1)-(T3-T2)
Здравствуйте, b-3, Вы писали:
b-3>по мультимедиа таймеру отмеряем интервал между отправкой sntp запроса и получением sntp ответа. Результат замера будет типа 5мс, что даёт нам смещение относительно ведущего компьютера с теоретической погрешностью до 2.5 мс из-за несимметричнности канала, но на практике там может быть стабильно лучше 1мс, особенно если соединить напрямую по ethernet b-3>- получение ответного пакета udp, содержащего метку времени, вызывает замер значения. В этот момент, имея свежую метку времени и держась за QueryPerformanceTimer, можно выжать что-то порядка 0.2-0.5 мс. Mission complete
Здравствуйте, b-3, Вы писали:
b-3>Здравствуйте, andrey_nado, Вы писали:
_>>Задача: синхронизировать время на двух или более компьютерах, находящихся в локальной сети. Точность синхронизации — порядка 1 миллисекунды. Использовать интернет не обязательно, один из компьютеров может использоваться в качестве эталона. Компьютеры работают под управлением OS Windows (XP или выше), но интересно также кроссплатформенное решение.
b-3>Я подскажу, что требование очень жесткое для Windows. Первым делом поставьте ntpd и посмотрите, какую точность обеспечит он. Если повезёт, это будет порядка 2-5 мс. Если не повезёт, то это может быть и 50 мс (что для вас много).
b-3>"Не повезёт" может означать к примеру следующее
b-3> b-3>* Сетевой концентратор вставляет задержки в 2-4 мс при доставке пакета[/li] b-3>* Точность таймера на материнской плате существенно хуже 1 мс b-3>* Исходное время подвержено скачкам в 30 (300, 3000... ) мс, т.к. корректируется бог весть как из интернетов b-3>* CPU на машинах загружен под 100% и из-за этого синхронизация ухудшается b-3>
b-3>В общем, я не разделяю всеобщего оптимизма. 1мс это очень жёстко для неспециализированного железа с виндой. Зачем собственно такая точность, передаёте какой-нибудь сигнал? Про самосинхронизирующиеся коды слышали? Если у вас задача не реалтаймовая, лучше использовать их, а не долбаться с NTP
Итого Windows не подходит для решения задач реального времени. Попытки вычислять "правильное" время не приведут ни к чему.. Проходил еще как на космос работал.. Там со временем очень жестко было.. Да еще и три процессора синхронизировались. Троированная система была.. Оптимальный вариант пересмотреть решение задачи и синхронизироваться где-то на более высоком уровне задачи, процессов, потоков. как ни назови. Лишь бы увеличить интервалы до реального. Либо менять операционку..