Каково использование CLOCK_REALTIME?

Я читаю о различии между CLOCK_REALTIME и CLOCK_MONOTONIC

Разница между CLOCK_REALTIME и CLOCK_MONOTONIC?

CLOCK_REALTIME имеет разрывы во времени, может прыгать вперед и назад: это ошибка в этих часах? Как часы, которые дают непоследовательное время, надежны?

Ответ 1

Несмотря на свои недостатки, CLOCK_REALTIME должна быть наилучшей оценкой системы текущего UTC или гражданского времени. Это основа для способности системы отображать то же время, что и вы, если бы вы посмотрели на часы, часы на стене или на свой сотовый телефон, или прослушали время, транслируемое на радиостанции и т.д. ( отображение включает преобразование из UTC в местное время, подробнее об этом позже.)

Но если CLOCK_REALTIME будет соответствовать времени UTC в реальном мире, есть как минимум две довольно значимые проблемы:

  • Что, если кто-то случайно установит часы на вашем компьютере неправильно? Им придется исправить это, и исправление может включать в себя скачок времени. В значительной степени это не так, особенно если ошибка большая (например, часы или дни).
  • Большинство компьютеров, к сожалению, не имеют возможности представлять секунды прыжка. Поэтому, когда в реальном мире есть прыжок, большинство компьютерных часов должны немного подпрыгнуть.

Итак, когда вы читаете, что CLOCK_REALTIME может иметь разрывы, может перепрыгивать вперед, а также назад, это не ошибка, это особенность: CLOCK_REALTIME должен иметь эти возможности, если он справляется с реальным миром со скачком секунд и иногда - неправильные часы.

Итак, если вы пишете код, который должен работать со временем, подходящим для реального мира, CLOCK_REALTIME - это то, что вы хотите, бородавки и все такое. В идеале, вы напишете свой код таким образом, чтобы он выглядел разумно изящно (не разбивается или не делает что-то странное), если время от времени по какой-то причине часы перескакивают вперед или назад.

Как вы, вероятно, знаете из другого вопроса, на который вы ссылаетесь, CLOCK_MONOTONIC гарантированно всегда будет двигаться вперед ровно на одну секунду в секунду без прыжков или разрывов, но абсолютное значение часов не означает много. Если значение CLOCK_MONOTONIC равно 13:05, это не означает его сразу после одного дня, обычно это означает, что компьютер работает и работает в течение 13 часов и 5 минут.

Итак, если все, что вас интересует, относительное время, CLOCK_MONOTONIC в порядке. В частности, если вы хотите узнать, сколько времени прошло, требуется два значения CLOCK_MONOTONIC и их вычитание, поскольку это не даст вам неправильного ответа, если бы произошел какой-то скачок времени (что повлияло бы на CLOCK_REALTIME) в между ними.

Или, в общем, как говорят люди в потоке комментариев, CLOCK_REALTIME - это то, что вам нужно для абсолютного времени, в то время как CLOCK_MONOTONIC лучше для относительного времени.

Теперь еще несколько точек.

Как уже упоминалось, CLOCK_REALTIME не совсем "настенное время", потому что он действительно имеет дело с UTC. Он использует знаменитое (печально известное?) Представление Unix/Posix секунд с 1970 года. Например, значение CLOCK_REALTIME 1457852399 переводится в 06:59:59 UTC 13 марта 2016 года. Где я живу, в пяти часах к западу от Гринвича, это переводится в 01:59:59 по местному времени. Но через секунду, 1457852400 переводится в 03:00:00, потому что наступает летнее время.

Я предположил, что если ваши часы были неправы, переход времени был в значительной степени единственным способом исправить это, но это не совсем так. Если ваши часы немного отшлифованы, можно исправить это путем "поворота" времени постепенно (слегка изменив тактовую частоту), чтобы через несколько минут или часов он переместился в нужное время без прыжка. То, что NTP пытается сделать, хотя в зависимости от его конфигурации, он может быть готов сделать это только для небольших ошибок.

Я сказал, что CLOCK_MONOTONIC обычно был временем, когда компьютер работал и работал. Это не гарантируется стандартом; весь стандарт говорит, что CLOCK_MONOTONIC подсчитывает время с некоторой произвольной временной точки. В системах, которые реализуют CLOCK_MONOTONIC в качестве времени, в течение которого система была в состоянии, могут быть две интерпретации: это время с момента загрузки или время, когда система была запущена и работает (то есть минус любое время, когда она спала или приостановлена)? На многих системах есть еще один часовой CLOCK_BOOTTIME, который рассчитывает время с момента загрузки (независимо от того, вставлено или приостановлено), в то время как CLOCK_MONOTONIC подсчитывает только время, когда система была запущена и работает.

Наконец, если вы хотите время навстречу, но вы хотите избежать прыжков или разрывов в прыжковые секунды, у вас возникла проблема из-за плохой обработки секунд прыжка в традиционном Unix/Linux (и Windows, и все остальные ) Компьютерные системы. В современных (4.x?) Ядрах Linux есть CLOCK_TAI, которые могут помочь. Некоторые экспериментальные системы могут реализовать еще один такт, CLOCK_UTC, который правильно обрабатывает секунды прыжка. У обоих из них есть другие затраты, и вам нужно будет действительно знать, что вы делаете, чтобы эффективно использовать их, по крайней мере, с сегодняшним уровнем поддержки. Для получения дополнительной информации см. список рассылки LEAPSECS.