Являются ли устойчивые часы устойчивой системы в целом? - PullRequest
4 голосов
/ 20 июня 2019

Я использую FastRTPS для связи между несколькими процессами в одной системе Linux. Они обмениваются информацией в пакетах. Каждый пакет имеет отметку времени, не зависящую от времени отправки или получения. Таким образом, передаваемая информация может быть использована правильно.

Я думал об использовании:

uint64_t time_in_microseconds = std::chrono::duration_cast
          <std::chrono::microseconds>(std::chrono::steady_clock::now()
          .time_since_epoch()).count(); 

чтобы получить метку времени для пакетов.

Тем не менее, устойчивые часы устойчивы между процессами в одной системе? Или только внутри одного процесса?

Если нет, то насколько системные часы изменяются при нормальных условиях? Сколько бы он сдвинулся «назад во времени»? (без настройки вручную, без подключения к интернету, без изменения времени и т. д.)

Спасибо

Редактировать:

Пакеты будут использоваться в алгоритмах оценки состояния и управления. Данные датчика будут, например, перемещаться из процесса чтения датчика в процесс оценки состояния. Информация о состоянии переместится из процесса оценки в процесс контроля. Вот почему я должен иметь возможность измерять интервалы последовательно по всей системе. Ни system_clock, ни stable_clock, кажется, не обеспечивают то, что мне нужно. System_clock согласован, но не монотонен. И устойчивые часы являются монотонными и последовательными внутри одного процесса, но, насколько я вижу, они не согласованы по всей системе? Либо это?

Ответы [ 2 ]

4 голосов
/ 20 июня 2019

steady_clock больше подходит для измерения интервалов.

std :: chrono :: stable_clock представляет монотонные часы.Временные точки этих часов не могут уменьшаться, так как физическое время движется вперед, а время между тиками этих часов постоянно.Эти часы не связаны со временем настенных часов (например, это может быть время с момента последней перезагрузки) и наиболее подходят для измерения интервалов.

system_clock - системаширокий и, вероятно, то, что вам нужно, но может не быть монотонным:

Класс std :: chrono :: system_clock представляет общесистемные настенные часы реального времени.Это может быть не монотонным: на большинстве систем системное время можно отрегулировать в любой момент.Это единственные часы C ++, которые могут отображать свои временные точки в стиле C и, следовательно, отображаться [до C ++ 20]

Будет изменена эпоха, с которой будет изменено c++20

system_clock измеряет время Unix (т. Е. Время с 00:00:00 UTC), четверг, 1 января 1970 г., не считая високосных секунд). [начиная с c ++ 20]

1 голос
/ 20 июня 2019

Вы можете использовать временные метки пакетов ядра, см. Семейство SO_TIMESTAMP :

Интерфейсы для получения временных меток сетевых пакетов:

  • SO_TIMESTAMP

    Генерирует временную метку для каждого входящего пакета в (не обязательно монотонном) системном времени.Сообщает метку времени через recvmsg () в управляющем сообщении в разрешении usec.SO_TIMESTAMP определяется как SO_TIMESTAMP_NEW или SO_TIMESTAMP_OLD в зависимости от типа архитектуры и представления time_t libc.Формат управляющего сообщения в struct __kernel_old_timeval для SO_TIMESTAMP_OLD и в struct __kernel_sock_timeval для параметров SO_TIMESTAMP_NEW соответственно.

  • SO_TIMESTAMPNS

    Тот же механизм отметки времени, что и SO_TIMP, но SO_TIMEST, как и SO_TIMPсообщает временную метку как struct timepec в разрешении nsec.SO_TIMESTAMPNS определяется как SO_TIMESTAMPNS_NEW или SO_TIMESTAMPNS_OLD в зависимости от типа архитектуры и представления time_t libc.Формат управляющего сообщения указывается в struct timepec для SO_TIMESTAMPNS_OLD и в struct __kernel_timespec для параметров SO_TIMESTAMPNS_NEW соответственно.

  • IP_MULTICAST_LOOP + SO_TIMESTAMP [NS]

    только дляmulticast: приблизительная временная метка передачи, полученная путем считывания временной метки зацикленного пакета.

  • SO_TIMESTAMPING

    Генерирует временные метки при приеме, передаче или обоих.Поддерживает несколько источников меток времени, включая оборудование.Поддерживается создание временных меток для потоковых сокетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...