Де вимірюється час Unix / Офіційний час? [зачинено]


20

Заперечення:

Я щойно пройшов список сайтів StackExchange близько 20 хвилин, намагаючись зрозуміти, де це розмістити. Якщо ви знаєте якийсь підходящий сайт, будь ласка, перенесіть це питання туди. Я публікую це тут, тому що час Unix змусив мене задуматися.


Отже, як ми всі знаємо, є час Unix і є UTC. Час Unix просто продовжує тикати, відраховуючи секунди - одну секунду в секунду -, тоді як UTC намагається тримати час у читаних для людини форматах, які ми використовуємо у відповідність із фазою Землі при її обертанні. Для цього UTC час від часу вставляє секунди, що мають стрибки.

Оскільки час відносно сили тяжіння, якому піддається об'єкт, що зазнає часу, інших видів прискорення та відносної швидкості, це призводить до двох питань. Давайте спочатку перейдемо до простого: Де вимірюється час Unix? Якщо Еліс і Боб погоджуються, то поточний час - 1467932496.42732894722748, коли вони знаходяться в одному місці (секунду, звичайно, визначають як 9'192'631'770 циклів випромінювання, що відповідають переходу між двома рівнями енергії цезію-133 атома в спокої і при 0 К), переживайте парадокс близнюків через Алісу, що живе на рівні моря, і Боба, що живе високо в горах, або Аліса, що живе на північному полюсі, і Боба, що живе на екваторі, більше не погодиться. Отже, як точно визначається час Unix?

Ви можете спочатку не побачити проблеми з UTC, тому що, безумовно, кожен може погодитися, коли земля закінчила орбіту (це, звичайно, ігнорування руху континентальної пластини, але я думаю, що ми це зрозуміли досить добре, оскільки за допомогою GPS можна виміряти їх рух дуже точно, і ми можемо вважати, що вони знаходяться у встановленому положенні в нашій моделі і не рухаються в міру зміщення континентальних плит), незалежно від того, знаходяться вони на горі, на рівні моря, на екваторі чи на північному полюсі. Можуть бути деякі часові відмінності, але вони не накопичуються.

Але секунда визначається як 9'192'631'770 циклів випромінювання, що відповідають переходу між двома енергетичними рівнями атома цезію-133 в спокої і при 0 К і атома цезію-133 не хвилюють земну орбіту. Тож UTC вирішує, куди слід вставити стрибну секунду, але має бути виміряний або передбачуваний зсув між фазою орбіти Землі та часом, виміряним десь атомним годинником. Де це десь?


5
"Час Unix просто продовжує тикати, рахуючи секунди - одну секунду в секунду" - насправді це не так. Все було б простіше, якби це було.
варення

3
Питання, яке, на вашу думку, ви хотіли задати, було б на тему з фізики - але це питання про норми часу, як, наприклад, UTC, і не має нічого спільного з часом UNIX. Дивіться також це та це та інші пов'язані питання.
David Z

7
Я голосую, щоб закрити це питання поза темою, оскільки мова йде про фізику, політику та часові стандарти, але не про Unix.
Майкл Гомер

3
Десь у цій галузі є певне тематичне запитання, яке ви могли б задати, але я не думаю, що це все. У ньому просто "... а як щодо Unix?" періодично кидають на незв'язане питання, як це свідчить відповідь.
Майкл Гомер

Відповіді:


30

На ваше заголовкове запитання немає реальної відповіді; Час Unix - це не справжній часовий масштаб, і його не "вимірюють" ніде. Це представлення UTC, хоч воно і погане, оскільки в UTC є моменти, які він не може представити. Час Unix наполягає на тому, щоб кожен день було 86 400 секунд, але UTC відхиляється від цього через стрибкові секунди.

Що стосується Вашого більш широкого питання, то тут є чотири важливі часові шкали:

  1. UT1 (Універсальний час), який обчислюється обсерваторіями по всьому світу, які вимірюють обертання Землі відносно нерухомих зірок. За допомогою цих спостережень та трохи математики ми отримуємо більш сучасну версію старого Грінвічського середнього часу, яка базувалася на моменті сонячного полудня в Королівській обсерваторії в Грінвічі. Універсальний час обчислюється організацією під назвою IERS (Міжнародна служба обертання та відліку систем Землі, раніше Міжнародна служба обертання Землі).

  2. TAI (Міжнародний атомний час), який зберігається сотнями атомних годин по всьому світу, підтримується національними органами з питань стандартизації тощо. Власники годин, які сприяють TAI, використовують методи передачі часу , щоб спрямовувати годинник один на одного, скасовуючи будь-які невеликі помилки окремих годин і створюючи час ансамблю; цей ансамбль - TAI, видане Міжнародним бюро ваг і заходів (BIPM), керівниками системи підрозділів СІ. Щоб відповісти на ваше запитання про розширення часу, TAI визначається як атомний час на рівні моря (власне, в геоїді, який є більш шаленою версією тієї ж ідеї), і кожен годинник виправляє наслідки власної висоти.

  3. UTC (Універсальний координований час). 1 січня 1972 року UTC був встановлений рівним десяти секундам після TAI, і з цієї дати він протікає вперед з тією ж швидкістю, що і для TAI, за винятком випадків, коли додається або віднімається високосна секунда. IERS приймає рішення оголосити стрибкову секунду, щоб зберегти різницю протягом 0,9 секунди (на практиці протягом приблизно 0,6 секунди; додана високосна секунда змушує різницю перейти з -0,6 до +0,4). Теоретично, стрибкові секунди можуть бути як позитивними, так і негативними, але, оскільки обертання Землі сповільнюється порівняно зі стандартом, встановленим SI та TAI, негативний стрибок у секунду ніколи не був необхідним і, ймовірно, ніколи не буде.

  4. Час Unix, який робить усе можливе, щоб представити UTC як єдине число. Кожен раз, який кратний 86,400, від Unix відповідає півночі UTC. Оскільки не всі дні UTC тривають 86 400 секунд, але всі "дні Unix" є, є непримиренна різниця, яку потрібно якось переламати. Немає часу Unix, що відповідає додатковій стрибковій секунді. На практиці системи або діятимуть так, ніби попередня секунда відбулася двічі (з часовою міткою Unix стрибнула назад на секунду назад, потім знову рухалася вперед), або застосувала таку техніку, як стрибкове розмазування, яке викривляє час протягом більш тривалого періоду з обох боків стрибок секунди. В будь-якому випадку є певна неточність, хоча принаймні друга є монотонною. В обох випадкахі b не дорівнює ba; це рівне ба плюс кількість втручаються стрибкових секунд .

Оскільки UT1, TAI, UTC та IERS є всесвітніми, багатонаціональними зусиллями, немає єдиного "куди", хоча бюлетені IERS публікуються з Паризької обсерваторії, а BIPM також базується в Парижі, це одна відповідь. Організація, яка потребує точного, відстежуваного часу, може вказати свою часову базу як щось на зразок "UTC (USNO)", а це означає, що їх часові позначки знаходяться в UTC і що вони походять від часу в Морській обсерваторії США, але враховуючи проблеми, які Я згадував про час Unix, це в основному несумісне з таким рівнем точності - кожен, хто має справу з дійсно точним часом, матиме альтернативу часу Unix.


1
Ви не помітили існування right/часових поясів у системі Олсона та як вони ставляться до них time_t.
JdeBP

1
@JdeBP Я насправді про це не чув. Я думаю, що називати цей час Unix трохи сумнівно, коли це явно суперечить як POSIX, так і давнім умовам, але це все одно цінна інформація. Можливо, ви можете додати відповідь про це?
варення

1
Найпростіший спосіб отримати високоточне джерело часу для простих людей - це GPS-приймач. Годинники на супутниках синхронізуються з TAI, і сигнал точний приблизно до 10⁻⁸ s (без виправлень; за допомогою поправок його можна покращити до 10⁻¹⁰).
Ян Худек

1
@JanHudec Це не так, як звичайні люди можуть визначити різницю між годинником з точністю до 10⁻² або 10⁻¹⁰.
Герріт

1
Лише натяк на те, чому UNIX не включає стрибкову другу підтримку. Про це неодноразово обговорювалося в телеконференції Austin Group, і результат цього полягав у тому, що додавання підтримки за стрибкові секунди спричинить більше проблем, ніж пропуск підтримки.
лукаво

12

Налаштування годинника координується IERS. Вони планують введення стрибкової секунди у часовий потік у міру необхідності.

З часової шкали NTP та стрибків секунд

Міжнародна служба обертання Землі (IERS) на Паризькій обсерваторії використовує астрономічні спостереження , надані US та інші обсерваторії , щоб визначити тимчасові рамки UT1 (штурман) виправлені для нерегулярних варіацій обертання Землі.

Наскільки мені відомо, 23:59:60 (Leap Second) та 00:00:00 наступного дня вважаються тією ж секундою в Unix Time.


8

Час UNIX вимірюється на вашому комп’ютері під керуванням UNIX.

Ця відповідь очікує, що ви дізнаєтесь, що таке Координаційний універсальний час (UTC), Міжнародний атомний час (ТАІ) та СІ другий. Пояснення їх виходить далеко за рамки Unix та Linux Stack Exchange. Це не обмін стеками фізики чи астрономії.

Апаратне забезпечення

Ваш комп'ютер містить різні генератори, які приводять у дію годинники та таймери. Точно те, що воно має, залежить від комп'ютера до комп'ютера, залежно від його архітектури. Але зазвичай і в дуже загальних рисах:

  • Десь існує програмований інтервал таймера (PIT), який може бути запрограмований для підрахунку заданої кількості коливань і викликає перерву в центральний процесорний блок.
  • На центральному процесорі є лічильник циклів, який просто нараховує 1 для кожного циклу інструкцій, який виконується.

Теорія функціонування, в дуже широкому плані

Ядро операційної системи використовує PIT для створення кліщів . Він налаштовує ПІТ на вільний хід, підраховуючи потрібну кількість коливань за часовий інтервал, скажімо, соту частину секунди, генеруючи переривання, а потім автоматично скидаючи лічильник знову. У цьому є різні варіанти, але по суті це призводить до того, що клітинне переривання піднімається з фіксованою частотою.

У програмному забезпеченні ядро ​​збільшує лічильник кожного галочки. Він знає частоту галочок, оскільки запрограмував ПДФО в першу чергу. Тож відомо, скільки кліщів складає секунда. Він може використовувати це, щоб знати, коли збільшувати лічильник, який відлічує секунди. Останнє - ідея ядра "UNIX Time". Дійсно, просто рахувати вгору зі швидкістю один на SI секунду, якщо залишити його власним пристроям.

Чотири речі ускладнюють це, що я збираюся представити в дуже загальних рисах.

Обладнання не ідеально. ПІТ, в описі якого описується, що у нього частота коливань N Герц може замість цього мати частоту (скажімо) N .00002 Герц, з очевидними наслідками.

Ця схема дуже погано взаємодіє з управлінням живленням, оскільки процесор прокидається сотні разів за секунду, щоб зробити трохи більше, ніж збільшення числа в змінній. Тож деякі операційні системи мають, як відомо, «безголосні» конструкції. Замість того, щоб змусити ПДФО надсилати переривання за кожну галочку, ядро ​​розраховує (із планувальника низького рівня), скільки кліщів буде проходити, не вичерпавшись жодних квантових потоків, і програмує ПІФО рахувати за стільки кліків у майбутнього перед тим, як видавати галочку переривання. Він знає, що тоді він повинен записати проходження N кліщів при наступному перериванні кліща, замість 1 галочки.

Прикладне програмне забезпечення має можливість змінювати поточний час ядра. Він може переходити до значення або може знижувати значення. Спати передбачає регулювання кількості кліщів, які повинні пройти, щоб збільшити лічильник секунд. Таким чином, лічильник секунд не обов'язково рахується зі швидкістю один на SI секунду в будь-якому випадку , навіть припускаючи ідеальні осцилятори. Крок передбачає просто записати нове число в лічильник секунд, що зазвичай не відбудеться до 1 SI секунди з моменту останньої позначки.

Сучасні ядра не тільки рахують секунди, але і рахують наносекунд. Але смішно і часто відверто нездійсненно перервати кліща один раз за наносекунд. Тут грають такі речі, як лічильник циклів . Ядро запам'ятовує значення лічильника циклу на кожній секунді (або на кожній галочці) і може розробитись із поточного значення лічильника, коли щось хоче знати час у наносекундах, скільки наносекунд повинно пройти з останньої секунди (або галочка). Знову ж таки, керування живленням та термічним режимом призводить до хаосу, оскільки частота циклу інструкцій може змінюватися, тому ядра роблять такі речі, як посилання на додаткове обладнання (наприклад, високоточний таймер подій (HPET)).

Мова C та POSIX

Стандартна бібліотека мови Сі описує час в термінах непрозорого типу, time_t, типу структури tmз різними заданими полями, а також різні функції , такі як бібліотеки time(), mktime(), і localtime().

Коротко: на мові С самого всього в гарантує , що time_tє одним з доступних числових типів даних , і що єдиний надійний спосіб різниці у часі вираховує є difftime()функцією. Саме стандарт POSIX надає більш жорсткі гарантії, що time_tнасправді є одним із цілих типів і що він рахує секунди після Епохи . Також стандарт POSIX визначає timespecтип структури.

time()Функція іноді описується як системний виклик. Насправді, це вже давно не є базовим системним викликом у багатьох системах. Наприклад, у FreeBSD лежить в основі системного виклику clock_gettime(), який має різні "годинники", які вимірюють секунди або секунди + наносекунди різними способами. Саме цей системний виклик, за допомогою якого програмне забезпечення читає UNIX Time з ядра. (Відповідний clock_settime()системний виклик дозволяє їм переходити, а adjtime()системний виклик дозволяє виконувати його.)

Багато людей махають стандартом POSIX навколо дуже чіткими і точними твердженнями щодо того, що він призначає. Такі люди частіше за все насправді не читають стандарт POSIX. Як випливає з його обґрунтування, ідея рахувати "секунди з епохи", це фраза, яку використовує стандарт, навмисно не визначає, що POSIX секунди мають таку саму тривалість, як і секунди SI, і що результат gmtime()"обов'язково" UTC, незважаючи на його появу ". Стандарт POSIX навмиснодостатньо розпущеним, так що він дозволяє (скажімо) UNIX-систему, куди йде адміністратор і вручну виправляє стрибкові секундні коригування, встановлюючи годинник через тиждень після того, як вони відбудуться. Справді, обґрунтування вказує на те, що навмисно досить вільно розміщувати системи, де годинник навмисно встановлений не так, ніж інший час UTC.

UTC та TAI

Інтерпретація часу UNIX, отриманого з ядра, полягає в підпрограмах бібліотеки, що працюють в додатках. POSIX вказує ідентичність між часом ядра та "часом розбиття" в a struct tm. Але, як одного разу зазначав Даніель Дж. Бернштейн, видання стандарту 1997 року сприйняло цю особу бентежно неправильно, зіпсувавши правило випускного року григоріанського календаря (те, що вивчають школярі), так що розрахунок був помилковим з 2100 року. "Більше шанувань у порушенні, ніж дотримання" - це фраза, яка легко приходить на розум.

І справді це так. Зараз деякі інтерпретації базують цю інтерпретацію на бібліотечних процедурах, написаних Артуром Девідом Олсоном, які консультуються з сумнозвісною "базою даних часового поясу Олсона", яка зазвичай кодується у файлах баз даних під /usr/share/zoneinfo/. Система Олсона мала два режими:

  • "Секундами з епохи" ядра вважається вважати UTC секундами з 1970-01-01 00:00:00 UTC, за винятком високосних секунд. Тут використовується posix/набір файлів баз даних часового поясу Olson. Усі дні мають 86400 секунд ядра, і ніколи не буває 61 секунду за хвилину, але вони не завжди тривають секунду SI, а годинник ядра потребує повороту або кроку, коли трапляються високосні секунди.
  • "Секундами з епохи" ядра вважається рахувати секунди TAI з 1970-01-01 00:00:10 TAI. Тут використовується right/набір файлів баз даних часового поясу Ольсона. Секунда в ядрі довга 1 SI секунди, а годинник ядра ніколи не потребує перемикання або кроку, щоб налаштувати стрибкові секунди, але розбитий час може мати такі значення, як 23:59:60, а дні не завжди мають 86400 секунд ядра.

М. Бернштейн написав кілька інструментів, включаючи свій daemontoolsнабір інструментів, який потрібен, right/оскільки вони просто додали 10, time_tщоб отримати секунди TAI з 1970-01-01 00:00:00 TAI. Він це задокументував на сторінці посібника.

Ця вимога була (можливо, несвідомо) успадкована наборами інструментів, такими як daemontools-encoreі runitФелікс фон Лейтнер libowfat. Наприклад, використовуйте Бернштейнаmultilog , Гюнтераmultilog або Папуsvlogd з posix/конфігурацією Олсона , і всі часові позначки TAI64N будуть (на момент написання цього запису) на 26 секунд відставати від фактичного другого рахунку TAI з 1970-01-01 00:00:10 ТАІ.

Ми з Лораном Беркотом вирішили це в s6 and nosh, хоча ми використовували різні підходи. М. Беркот tai_from_sysclock()покладається на прапор часу збирання. інструменти, що працюють в TAI64N, переглядають змінні TZта TZDIRоточення для автоматичного виявлення, posix/і right/якщо вони можуть.

Цікаво, що документи FreeBSD time2posix()та posix2time()функції, які дозволяють еквівалентно right/режиму Олсона з time_tTAI секундами. Однак, очевидно, вони не включені.

Ще раз…

Час UNIX вимірюється на вашому комп'ютері під управлінням UNIX за допомогою осциляторів, що містяться в апараті комп'ютера. Він не використовує СІ секунд; це не UTC, хоча він може зовні нагадувати його; і це навмисно дозволяє вашому годиннику помилятися.

Подальше читання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.