Время в вычислительной технике
Часы, метки времени и синхронизация
Узнать о компьютерном времениКомпьютерам необходимо точное время для ведения журналов, планирования задач, проверки сертификатов безопасности, транзакций баз данных и бесчисленного множества других операций. Понимание того, как системы измеряют, хранят и синхронизируют время, необходимо для разработчиков, администраторов и всех, кто занимается решением проблем, связанных со временем.
Как компьютеры хранят время
Аппаратные часы
- RTC (часы реального времени): микросхема с батарейным питанием, сохраняющая время при выключении
- Кварцевый генератор: кварцевый кристалл, обеспечивающий стабильную частоту (обычно 32 768 Гц)
- Дрейф: аппаратные часы уходят на секунды или минуты в месяц
Системные часы
- Программные часы, поддерживаемые операционной системой
- Инициализируются из RTC при загрузке
- Синхронизируются через сетевые протоколы (NTP)
- Могут корректироваться чаще, чем RTC
Протокол сетевого времени (NTP)
NTP синхронизирует часы компьютеров по сети, обеспечивая миллисекундную точность через интернет и субмиллисекундную в локальных сетях.
Уровни стратума
| Стратум | Источник | Точность |
|---|---|---|
| 0 | Атомные часы, GPS-приёмник | Наносекунды |
| 1 | Напрямую подключён к стратуму 0 | Микросекунды |
| 2 | Синхронизирован со стратумом 1 | Миллисекунды |
| 3–15 | Каждый уровень синхронизируется с вышестоящим | Постепенно снижается |
Как работает NTP
- Клиент отправляет запрос с меткой времени
- Сервер отвечает своими метками времени
- Клиент вычисляет сетевую задержку и смещение
- Часы постепенно корректируются (плавная подстройка) во избежание скачков
Форматы хранения времени
| Формат | Пример | Применение |
|---|---|---|
| Unix-метка (с) | 1705329000 | Базы данных, API |
| Unix-метка (мс) | 1705329000000 | JavaScript, Java |
| ISO 8601 | 2024-01-15T14:30:00Z | JSON, API, журналы |
| RFC 2822 | Mon, 15 Jan 2024 14:30:00 +0000 | Заголовки электронной почты |
| SQL DATETIME | 2024-01-15 14:30:00 | Базы данных |
| SQL TIMESTAMP | 2024-01-15 14:30:00 | Автообновляемые поля |
Проблемы распределённых систем
Расхождение часов
Разные машины имеют незначительно различающееся время, что приводит к:
- Нарушению порядка событий в журналах
- Состояниям гонки в распределённых транзакциях
- Ошибкам проверки сертификатов
Решения
- NTP/PTP: поддержание синхронизации часов
- Логические часы: векторные часы, метки времени Лэмпорта
- Протоколы консенсуса: Raft, Paxos для упорядочивания событий
- TrueTime (Google): GPS-синхронизация с ограниченной неопределённостью
Распространённые проблемы со временем
Проблема Y2K (1999–2000)
Двузначное представление года не позволяло обозначить 2000 год. Исправление обошлось в миллиарды долларов по всему миру.
Проблема 2038 года
32-битные Unix-метки времени переполнятся 19 января 2038 года. Ведётся переход на 64-битные значения.
Ошибки секунд координации
Некоторые системы дают сбой, когда часы показывают 23:59:60. Секунды координации будут упразднены к 2035 году.
Ошибки перехода на летнее время
Запланированные задачи могут выполняться дважды или пропускаться при переводе часов.
Лучшие практики
- Используйте UTC внутри системы: храните и обрабатывайте в UTC; конвертируйте для отображения
- Используйте ISO 8601: однозначный, сортируемый формат
- Включайте информацию о часовом поясе: 2024-01-15T14:30:00+05:30, а не просто «14:30»
- Синхронизируйте через NTP: поддерживайте все серверы в пределах миллисекунд
- Тестируйте пограничные случаи: переходы на летнее время, високосные годы, границы лет
- Используйте 64-битные метки времени: избегайте проблемы 2038 года
Заключение
Компьютерное время включает в себя аппаратные часы, синхронизацию операционной системы и сетевые протоколы, работающие совместно. NTP обеспечивает точность часов по всей сети. Храните время в UTC с информацией о часовом поясе; используйте формат ISO 8601 для обмена данными. Помните о пограничных случаях — переходах на летнее время, секундах координации и проблеме 2038 года. В распределённых системах синхронизация часов — основа корректной работы.