![](https://habrastorage.org/files/67c/e68/4f8/67ce684f82284b9c994b9e9048ddcf54.jpg)
Докладная записка
Мой Адмирал, ваш флот насчитывает сотни, а может и тысячи кораблей. Все они действуют, как единый организм, действуя в одном информационном поле. В качестве канала связи используется радиоэфир, либо лазерная связь в случае работы в условиях радиоподавления (либо радиомолчания). Вероятнее всего, в качестве базового программного обеспечения, на кораблях используется Erlang, а каждый корабль является Нодой вычислительного кластера вашей космической армады. Благодаря этому, боевые программы, выполняемые на флагманском корабле, могут управлять ресурсами любого корабля армады, как своими собственными, координируя боевое взаимодействие. В условиях ведения космической битвы в окрестностях нашей солнечной системы, такой подход показал высокую эффективность, как на испытаниях, так и в реальном бою. Однако, партия ставит перед нами новую задачу: не допускать проникновения противника в пределы нашей солнечной системы, обнаружение противника и борьбу с ним вести на дальних рубежах.
В условиях субсветовых скоростей и огромных расстояний нас подстерегает новый враг. На этот раз технический. Этого врага зовут «временной разрыв» (Time Warp). Что это такое и как с ним бороться (используя Erlang версии 18 и выше), изложено в данной докладной записке. Записка основана на технической документации — Time and Time Correction in Erlang.
Единый таймлайн
Новые условия ставят перед инженерами новые технические задачи. Слаженная работа космических объектов достигается не только сетевым взаимодействием, но и точной синхронизацией часов со временем на Земле. Для того, чтобы автоматический космический объект мог следовать заданной программе, либо действовать в условиях потери сетевой связи, его внутренние часы должны быть синхронизированы со временем Земли. Для этого, в пределах нашей солнечной системы, правительство(на деньги налогоплательщиков) построило и установило группировку спутников временной синхронизации. Теперь любой автоматический спутник даже в случае повреждения основных аккумуляторов, в условиях работы только напрямую от солнечных батарей, способен принять сигнал ближайшего спутника временной синхронизации и определить точное время.
Почему эта система не поможет в бою?
1) В новых условиях, мы должны сражаться за пределами солнечной системы. В открытом космосе нет спутников временной синхронизации.
2) Боевой флот не может и не должен быть зависим от гражданских систем.
3) Боевой флот не может зависеть от стационарных систем.
Флот обязан быть полностью самостоятельным и самодостаточным.
Для этого, корабли флота должны самостоятельно синхронизировать время друг с другом. Вероятнее всего, все часы нужно синхронизировать с часами флагмана.
Но вы скажете: «На наших крейсерах установлены атомные часы, даже в кораблях истребителях используются часы на рубидиевых опорных генераторах, а управляемая ракета живет не так долго, чтобы ее термокомпенсированный кварцевый генератор ошибся на значимое значение». И будете правы. Да, можно один раз перед боем провести синхронизацию. В процессе боя, отдельные корабли могут терять связь с кластером, но продолжать выполнять боевые задачи в одном масштабе времени.
![](https://habrastorage.org/files/15d/1dd/6bd/15d1dd6bd9ad4880aac1633f5d94e6ea.jpg)
Действия в условиях разных масштабов времени
Существует ряд причин, по которым в кораблях может установиться разное значение времени:
— флагманский корабль может подойти к месту событий через подпространственный тоннель: в этом случае он мгновенно сменит свои координаты, при этом не теряя синхронизации с временем Земли;
— спутник наблюдения, находящийся в месте событий, мог там находиться длительное время без возможности синхронизации, и из за неточности генератора в часах, его время может как «отстать» от времени Земли, так и «уйти вперед»
— корабли среднего класса могут подойти к месту событий на субсветовых скоростях и на их часы могут повлиять релятивистские эффекты
— автоматические корабли, прошедшие рядом или через сверхмассивную черную дыру
В каждом случае, как только корабль появится в зоне радиовидимости флагмана, он произведет синхронизацию времени, с последующим подключением к кластеру. В процессе синхронизации, часы синхронизируемого корабля будут переведены вперед, или, что еще хуже, назад. Этот эффект называется временным разрывом (Time Warp).
![](https://habrastorage.org/files/ec6/5a3/743/ec65a37437c3495caafc97192eed756e.jpg)
Техническое решение
В OTP 18 (ERTS версии 7.0) были расширены функциональные возможности работы со временем. Эти возможности включены в API для работы со временем и с разрывами времени (time warp), которые изменяют поведение систем при изменении системного времени. Режим работы с разрывами времени, который используется по умолчанию, ведет себя так же, как и старое API, которое пока еще в силе. Таким образом, вы можете ничего не менять, если не хотите этого. Однако, настоятельно рекомендуется использовать новые функции API вместо старых, которые основаны на erlang:now/0. В настоящее время erlang:now/0 помечен, как устаревший (deprecated), так как он является узким местом при масштабируемости. Используя новый API, вы автоматически улучшаете свойства маcштабируемости и производительность. Так же у вас появляется возможность использования режима мульти-разрывов (multi-time warp), что повышает точность измерения времени.
Платформа Erlang, использует не только часы реального времени, но и внутренний счетчик тактов процессора. Благодаря временной коррекции Erlang, приложениям гарантируется, что Erlang monotonic clock не имеют разрывов во времени и являются относительно точными. Для полного понимания работы временных систем, пожалуйста, направьте ваших инженеров к технической документации [1]. В ней даются понятия из нового временного API, такие, как: «монотонное время», «строго монотонное время», UT1, UTC. POSIX Time, Time Precision, Time Resolution, Time Accuracy, Time Warp, OS System Time, OS Monotonic Time, Erlang System Time, Erlang Monotonic Time и др. Описаны возможности получения как Erlang так и системного времени, даны инструкции по корректировке устаревшего программного кода.
![](https://habrastorage.org/files/002/6e5/f85/0026e5f851174251a8fd2dd5eccb4e48.jpg)
Команда Erlang идет в ногу со временем, добро пожаловать в будущее!
Список использованных источников
1. http://erlang.org/doc/apps/erts/time_correction.html — Время и временная коррекция в Erlang