유닉스 시간 / 공식 시간은 어디에 측정됩니까? [닫은]


20

면책 조항 :

방금 StackExchange 사이트 목록을 약 20 분 동안 살펴보고 게시 위치를 알아 냈습니다. 더 적합한 사이트를 알고 있다면이 질문을 여기로 옮기십시오. 유닉스 시간이 나를 생각하게했기 때문에 이것을 여기에 게시하고 있습니다.


우리 모두 알다시피 유닉스 시간과 UTC가 있습니다. 유닉스 시간은 계속 똑딱 거리며 초 당 1 초를 세는 반면 UTC는 우리가 사용하는 인간이 읽을 수있는 형식으로 지구의 위상에 맞춰 시간을 유지하려고합니다. 이를 위해 UTC는 때때로 윤초를 삽입합니다.

시간은 물체에 노출되는 시간이 다른 종류의 가속도 및 상대 속도에 중력에 비례하기 때문에 두 가지 질문이 있습니다. 간단한 것을 먼저 극복 해 봅시다 : 유닉스 시간은 어디에 측정됩니까? Alice와 Bob이 현재 시간이 동일한 장소에있을 때 1467932496.42732894722748에 동의하기 시작하면 (두 번째는 세슘 -133의 두 에너지 레벨 사이의 전이에 해당하는 9'192'631'770 사이클 주기로 정의 됨) 앨리스는 휴식을 취하고 0 K), 해수면에 살고있는 앨리스와 산에 높이 살고있는 밥 또는 북극에 살고있는 앨리스와 적도에 살고있는 밥으로 인해 쌍둥이 역설을 경험합니다. 그렇다면 유닉스 시간은 어떻게 정확하게 정의됩니까?

지구가 궤도를 완료했을 때 모든 사람들이 동의 할 수 있기 때문에 처음에는 UTC 문제가 보이지 않을 수도 있습니다 (물론 대륙 판의 움직임을 무시하는 것이지만 GPS를 사용하면 GPS의 움직임을 측정 할 수 있기 때문에 잘 파악할 수 있다고 생각합니다 매우 정확하게 그리고 우리는 그것들이 우리의 모델에서 정해진 위치에 있다고 가정 할 수 있으며, 대륙, 산, 해수면, 적도 또는 북극에 있든 대륙판이 움직일 때 움직이지 않는다고 가정 할 수 있습니다. 시간 차이가있을 수 있지만 누적되지 않습니다.

그러나 두 번째는 정지 상태와 0K의 세슘 -133 원자의 두 에너지 수준 사이의 전이에 해당하는 9'192'631'770주기의 방사선으로 정의되며, 세슘 -133 원자는 지구 궤도를 신경 쓰지 않습니다. UTC는 어디에 윤초 삽입 결정하지만 지구 궤도의 위상과 측정 시간 사이에 측정되거나 예측 된 변화가있을 갖도록 어딘가에 원자 시계에 의해. 어딘가에 있습니까?


5
"유닉스 시간은 계속 똑딱 거리고 초를 1 초로 세는 것입니다."-실제로는 그렇지 않습니다. 그렇게하면 상황이 더 간단해질 것입니다.
hobbs

3
필자가 생각한 질문은 물리학 에 관한 주제에 관한 것이었지만 UTC와 같은 시간 표준에 관한 질문이며 UNIX 시간과 관련이 없습니다. 이것이것 과 다른 관련 질문 도 참조하십시오 .
David Z

7
물리, 정치, 시간적 표준에 관한 것이지만 Unix는 아니기 때문에이 질문을 주 제외로 닫으려고합니다.
마이클 호머

3
이 영역 어딘가에 당신이 요청할 수있는 주제에 관한 질문 이 있을 것입니다 . 그러나 나는 이것이 그렇게 생각하지 않습니다. "... 그리고 유닉스는 어때?" 답변이 보여주는 것처럼 때때로 관련이없는 질문에 던져졌다.
마이클 호머

답변:


30

제목 질문에는 실제 답변이 없습니다. 유닉스 시간은 실제 시간 척도가 아니며 어디에서나 "측정"되지 않습니다. UTC에는 표현할 수없는 순간이 있기 때문에 가난한 표현이지만 UTC를 나타냅니다. 유닉스 타임은 매일 86,400 초가 필요하다고 주장하지만 UTC는 윤초로 인해 그와 다릅니다.

더 넓은 질문에 관해서는 다음 네 가지 중요한 시간 척도가 있습니다.

  1. UT1 (Universal Time) : 고정 별에 대한 지구의 회전을 측정하는 전 세계 관측소에서 계산합니다. 이러한 관찰과 약간의 수학을 통해 그리니치 왕립 천문대의 태양 정오의 순간을 기반으로 한 오래된 그리니치 평균시의 현대 버전을 얻습니다. 국제 시간은 IERS (국제 지구 회전 및 참조 시스템 서비스, 이전에는 국제 지구 회전 서비스) 라는 조직에서 계산합니다 .

  2. TAI (International Atomic Time)는 전 세계 수백 개의 원자 시계에 의해 유지되며 국가 표준기구 등이 유지합니다. TAI에 기여하는 시계의 키퍼는 시간 전송 기술을 사용 하여 시계를 서로 향하게하여 개별 시계의 작은 오류를 제거하고 앙상블 시간을 만듭니다. 해당 앙상블은 국제 단위 가중치 및 측정 국 (BIPM)에 의해 출판 된 TAI이며 SI 단위 시스템의 청지기입니다. 시간 팽창에 대한 귀하의 질문에 대답하기 위해 TAI는 해수면 (실제로 같은 아이디어의 더 멋진 버전 인 지오이드)의 원자 시간으로 정의 되며 각 시계는 자체 고도의 영향을 수정합니다.

  3. UTC (협정 세계시 ) UTC는 1972 년 1 월 1 일 TAI보다 10 초 뒤떨어져 설정되었으며, 그 이후로 윤초를 더하거나 뺄 때를 제외하고는 TAI와 정확히 같은 속도로 틱을 전달합니다. IERS는 0.9 초 내에 차이를 유지하기 위해 윤초를 발표하기로 결정합니다 (실제로 약 0.6 초 내에; 윤초를 추가하면 차이가 -0.6에서 +0.4로 변경됨). 이론적으로 윤초는 양수와 음수 일 수 있지만 SI 및 TAI에 의해 설정된 표준에 비해 지구의 회전 속도가 느려지기 때문에 음수 윤초는 절대로 필요하지 않았을 것이며, 절대로하지 않을 것입니다.

  4. 유닉스 시간. UTC를 단일 숫자로 나타내는 것이 가장 좋습니다. 86,400의 배수 인 모든 유닉스 시간은 UTC 자정에 해당합니다. 모든 UTC 날짜가 86,400 초 길이는 아니지만 모든 "유닉스 날짜"가 있기 때문에 어떻게 든 패치 할 수없는 차이가 있습니다. 윤초가 추가 된 Unix 시간은 없습니다. 실제로, 시스템은 이전 초가 두 번 발생한 것처럼 작동하고 (유닉스 타임 스탬프가 1 초 뒤로 이동 한 다음 다시 진행됨) 도약 번짐 과 같은 기술을 적용하여 어느 한 쪽에서 더 오랜 시간 동안 시간을 ​​왜곡시킵니다. 윤초. 적어도 두 번째는 단조롭지 만 두 경우 모두 부정확성이 있습니다. 두 경우 모두(B)는 (BA)와 동일하지 않다; ba + 중간 도약 시간 수와 같습니다 .

UT1, TAI, UTC 및 IERS는 모두 전 세계적으로 다국적 노력이므로 IERS 게시판이 파리 천문대에서 게시되고 BIPM도 파리에 기반을두고 있지만 하나의 "where"는 없습니다. 정확하고 추적 가능한 시간이 필요한 조직은 타임베이스를 "UTC (USNO)"와 같이 명시 할 수 있습니다. 이는 타임 스탬프가 UTC이고 미국 해군 관측소의 시간에서 파생되었지만 유닉스 타임에서 언급 한 바에 따르면, 기본적으로이 정도의 정밀도와 호환되지 않습니다. 실제로 정확한 시간을 다루는 사람이라면 누구나 유닉스 타임을 대체 할 수 있습니다.


1
right/Olson 시스템에서 시간대 의 존재 와 이들이 어떻게 고려되는지 간과했습니다 time_t.
JdeBP

1
@JdeBP 실제로는 들어 보지 못했습니다. POSIX와 오랜 관례에 모두 반대되는 유닉스 시대라고 부르는 것은 다소 모호한 일이지만 어쨌든 소중한 정보입니다. 아마도 그것에 대한 답변을 추가 할 수 있습니까?
hobbs

1
일반인을 위해 매우 정확한 시간 소스를 얻는 가장 쉬운 방법은 GPS 수신기입니다. 위성의 클럭은 TAI와 동기화되며 신호는 약 10⁻⁸까지 정확합니다 (보정없이; 수정하면 10⁻¹⁰로 향상 될 수 있음).
Jan Hudec

1
@JanHudec 평범한 사람들이 10⁻² 또는 10⁻¹⁰에 정확한 시계의 차이를 말할 수있는 것과는 다릅니다.
gerrit

1
유닉스에 윤초 지원이 포함되지 않은 이유에 대한 힌트. 이것은 Austin Group 원격 회의에서 여러 번 논의되었으며 그 결과 윤초에 대한 지원을 추가하면 지원을 생략하는 것보다 더 많은 문제가 발생할 수있었습니다.
schily

12

시계 조정은 IERS에 의해 조정됩니다. 필요에 따라 윤초를 시간 스트림에 삽입하도록 예약합니다.

에서 NTP는 시간 단위와 도약 초

파리 천문대 의 국제 지구 회전 서비스 (IERS)는 USNO 및 기타 관측소에서 제공 한 천문 관측을 사용하여 지구 회전의 불규칙한 변화에 대해 수정 된 UT1 (네비게이터) 시간 척도를 결정합니다.

내가 아는 한 23:59:60 (Leap Second)과 00:00:00은 Unix Time에서 같은 초로 간주됩니다.


8

UNIX 시간은 UNIX를 실행하는 컴퓨터에서 측정됩니다.

이 답변은 UTC (Coördinated Universal Time), TAI (International Atomic Time) 및 SI 초가 무엇인지 알기를 기대합니다. 그것들을 설명하는 것은 Unix와 Linux Stack Exchange의 범위를 넘어선 것입니다 . 이것은 물리학 또는 천문학 스택 교환 이 아닙니다 .

하드웨어

컴퓨터에는 시계와 타이머를 구동하는 다양한 발진기가 있습니다. 정확하게는 아키텍처에 따라 컴퓨터마다 다릅니다. 그러나 일반적으로 매우 일반적인 용어는 다음과 같습니다.

  • 주기적 타이머 진동의 특정 번호를 카운트하고, 중앙 처리 장치에 인터럽트를 트리거하도록 프로그램 될 수있다 (PIT)은 대체로.
  • 중앙 프로세서에는 실행되는 각 명령주기마다 1을 계산 하는 주기 카운터 가 있습니다.

매우 광범위한 용어로 작동 이론

운영 체제 커널은 PIT를 사용하여 을 생성 합니다. PIT를 프리 런으로 설정하여 100 분의 1 초의 시간 간격 동안 올바른 진동 수를 세고 인터럽트를 생성 한 다음 카운트를 자동으로 재설정하여 다시 가도록합니다. 이에 대한 변형이 있지만 본질적 으로 고정 주파수 로 인터럽트가 발생합니다.

소프트웨어에서 커널은 틱마다 카운터를 증가시킵니다. PIT를 처음부터 프로그래밍했기 때문에 틱 주파수를 알고 있습니다. 따라서 1 초에 몇 개의 진드기가 구성되는지 알고 있습니다. 이를 사용하여 초를 세는 카운터를 언제 증가시켜야하는지 알 수 있습니다. 후자는 커널의 "UNIX Time"에 대한 아이디어입니다. 실제로 자체 장치에 남겨두면 SI 초 당 하나의 속도로 단순히 위로 계산합니다.

네 가지가 이것을 복잡하게 만듭니다. 저는 이것을 매우 일반적인 용어로 표현하려고합니다.

하드웨어가 완벽하지 않습니다. 데이터 시트에 발진기 주파수가 N Hertz 라고 말하고있는 PIT 는 대신 N .00002 Hertz 의 주파수를 가질 수 있으며, 결과는 명백합니다.

이 체계는 CPU가 변수의 숫자를 증가시키기 위해 초당 수백 번 깨우기 때문에 전원 관리와 매우 나쁘게 상호 운용됩니다. 따라서 일부 운영 체제는 "틱없는"디자인으로 알려져 있습니다. PIT가 모든 틱에 대해 인터럽트를 보내도록하는 대신, 커널은 (낮은 레벨 스케줄러에서) 스레드 퀀텀이 없어도 틱이 몇 개나 진행되는지, PIT를 프로그래밍하여 틱을 계산합니다. 틱 인터럽트를 발행하기 전에 미래. 그러면 1 틱 대신 다음 틱 인터럽트에서 N 틱 의 통과를 기록해야한다는 것을 알고 있습니다.

응용 프로그램 소프트웨어는 커널의 현재 시간을 변경할 수 있습니다. 이 수 단계 값을하거나 수행 할 수 있습니다 죽이고 값을. 선회는 초 카운터를 증가시키기 위해 틱 수를 조정하는 것과 관련이 있습니다. 초 그래서 카운터 반드시 두 번째 SI 당 하나의 비율로 계산하지 않습니다 어쨌든 , 심지어 완벽한 오실레이터 가정. 스테핑은 초 카운터에 단순히 새로운 숫자를 작성하는 것과 관련이 있으며, 마지막 초가 넘어간 후 1 SI 초까지는 발생하지 않습니다.

최신 커널은 초뿐만 아니라 나노초도 계산합니다. 그러나 1 초에 한 번 틱 인터럽트가 발생하는 것은 말도 안되며 종종 불가능합니다. 이곳은 사이클 카운터 와 같은 것들이 작용하는 곳 입니다. 커널은 1 초마다 (또는 각 틱마다) 사이클 카운터 값을 기억하고, 나노초 단위의 시간을 알고 자하는 카운터 의 현재 값에서 마지막 1 초 이후 경과 된 나노초 수를 계산할 수 있습니다. 진드기). 그러나 전원 및 열 관리는 명령주기 주파수가 변경 될 수 있기 때문에 이로 인해 혼란을 겪습니다. 따라서 커널은 HPET (고정밀 이벤트 타이머)와 같은 추가 하드웨어에 의존하는 것과 같은 일을합니다.

C 언어와 POSIX

C 언어의 표준 라이브러리는 은폐 형의 측면에서 시간을 설명 time_t하는 구조 타입 tm다양한 특정 필드와 같은 다양한 라이브러리 함수 time(), mktime(), 및 localtime().

간단히 말해서 C 언어 자체time_t 는 사용 가능한 숫자 데이터 유형 중 하나이며 시간 차이를 계산하는 신뢰할 수있는 유일한 방법은 difftime()함수 라는 것을 보증 합니다. POSIX 표준 time_t은 실제로 정수 유형 중 하나이며 Epoch 이후 초를 세는 엄격한 보증을 제공합니다 . timespec구조 유형 을 지정하는 것도 POSIX 표준입니다 .

time()기능은 때때로 시스템 호출로 설명되어 있습니다. 사실, 그것은 오늘날 많은 시스템에서 기본 시스템 호출이 아니 었습니다. 예를 들어 FreeBSD에서 기본 시스템 호출은입니다 clock_gettime(). 여기에는 다양한 방법으로 초 또는 초 + 나노초 단위로 측정 할 수있는 다양한 "시계"가 있습니다. 응용 프로그램 소프트웨어가 커널에서 UNIX 시간을 읽는 것은이 시스템 호출입니다. (일치하는 clock_settime()시스템 호출을 통해 단계를 수행하고 adjtime()시스템 호출을 통해 시스템을 종료 할 수 있습니다.)

많은 사람들이 POSIX 표준을 규정하는 것에 대해 매우 명확하고 정확한 주장으로 흔들어 놓습니다. 그러한 사람들은 종종 POSIX 표준을 실제로 읽지 않습니다 . 이론적 근거에서 알 수 있듯이 표준에서 사용하는 "에 포치 이후의 초"를 세는 아이디어는 의도적으로 POSIX 초가 SI 초와 길이가 같거나 결과 gmtime()가 "필수적으로"라고 지정하지 않습니다. 모양에도 불구하고 UTC ". POSIX 표준은 의도적으로관리자가 가서 일주일 후 시계를 재설정하여 윤초 조정을 수동으로 수정하는 UNIX 시스템을 허용 할 정도로 충분히 느슨합니다. 실제로, 근거는 시계 현재 UTC 시간 이외의 시간 으로 의도적으로 잘못 설정된 시스템을 수용하기에 의도적으로 느슨하다고 지적합니다 .

UTC와 TAI

커널에서 얻은 UNIX 시간 해석은 응용 프로그램에서 실행되는 라이브러리 루틴에 달려 있습니다. POSIX는 커널 시간과 "중단 시간"사이의 ID를 지정합니다 struct tm. 그러나 Daniel J. Bernstein이 한 번 지적했듯이 1997 년판 표준은이 정체성을 난처하게 잘못 이해하여 Gregorian Calendar의 윤년 규칙 (학생들이 배우는 것)을 어지럽게하여 2100 년부터 계산에 오류가 발생했습니다. "관념보다 위반에 더 영광이된다"는 마음에 떠오른 문구입니다.

그리고 실제로 그렇습니다. 오늘날 몇몇 시스템은 Arthur David Olson이 작성한 라이브러리 루틴을 기반으로이 해석을 기반으로하며, 일반적으로 아래의 데이터베이스 파일로 인코딩 된 악명 높은 "올슨 시간대 데이터베이스"를 참조합니다 /usr/share/zoneinfo/. Olson 시스템에는 두 가지 모드가 있습니다.

  • 커널의 "Epoch 이후 초"는 윤초를 제외하고 1970-01-01 00:00:00 UTC 이후 UTC 초를 계산하는 것으로 간주됩니다. 이것은 posix/Olson 시간대 데이터베이스 파일 세트를 사용 합니다. 모든 날에는 86400 커널 초가 있으며 분당 61 초는 아니지만 항상 SI 초의 길이는 아니며 윤초가 발생할 때 커널 시계가 회전하거나 스테핑해야합니다.
  • 커널의 "Epoch 이후의 초"는 1970-01-01 00:00:10 TAI 이후의 TAI 초를 계산하는 것으로 간주됩니다. 이것은 right/Olson 시간대 데이터베이스 파일 세트를 사용 합니다. 커널 초의 길이는 1 SI 초이며 커널 시계는 윤초를 조정하기 위해 회전 또는 스테핑을 할 필요가 없지만 고장 시간은 23:59:60과 같은 값을 가질 수 있으며 일이 항상 86400 커널 초인 것은 아닙니다.

M. Bernstein은 도구 daemontools세트를 포함하여 1970-01-01 00:00:00 TAI 이후 TAI 초를 얻기 위해 right/10을 추가했기 때문에 필요한 여러 도구를 작성했습니다 time_t. 그는 이것을 매뉴얼 페이지에 문서화했습니다.

이 요구 사항은 (아마도 무의식적으로) 등의 툴 세트에 의해 상속 daemontools-encorerunit펠릭스 폰 Leitner의의에 의해 libowfat. 사용 번스타인multilog , 귄터multilog , 또는 파페svlogd 올슨과 posix/구성, 예를 들어, 그리고 TAI64N 타임 스탬프 모두가 뒤에 26초 (이 글을 쓰는 시점에서)입니다 실제 번째 1970-01-01 0시 0분 10초부터 계산 TAI를 타이.

Laurent Bercot와 나는 우리가 다른 접근법을 취했지만 s6와 nosh에서 이것을 해결했습니다. M. Bercot tai_from_sysclock()는 컴파일 타임 플래그에 의존합니다. 상기 TAI64N 모양의 거래 것을 요기 도구 TZTZDIR에 대한 환경 변수를 자동 감지 posix/하고 right/그들이 할 수있는 경우.

흥미롭게도 FreeBSD 문서 time2posix()posix2time()함수는 Olson right/모드와 동등한 time_tTAI 초 를 허용합니다 . 그러나 분명히 가능하지는 않습니다.

다시 한번…

UNIX 시간은 컴퓨터 하드웨어에 포함 된 발진기에 의해 UNIX를 실행하는 컴퓨터에서 측정됩니다. SI 초를 사용하지 않습니다. 피상적으로 비슷하더라도 UTC가 아닙니다. 그것은 의도적으로 잘못된 당신의 시계를 허용합니다.

추가 자료

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.