부인 성명:
나는 이 글을 어디에 게시할지 찾기 위해 약 20분 동안 StackExchange 사이트 목록을 검색해 왔습니다. 혹시 더 적합한 사이트를 알고 계시다면 이 질문을 그곳으로 옮겨주세요. 유닉스 시간이 나를 생각하게 만들었기 때문에 여기에 이것을 게시하고 있습니다.
우리 모두 알고 있듯이 유닉스 시간과 UTC가 있습니다. Unix 시간은 초 단위(초당 1초) 단위로 계속 흐르고 있는 반면, UTC는 우리가 사용하는 사람이 읽을 수 있는 형식으로 지구 자전 단계와 시간을 일치시키려고 노력합니다. 이를 위해 UTC는 때때로 윤초를 삽입합니다.
시간은 중력, 다른 유형의 가속도 및 시간을 경험하는 물체가 경험하는 상대 속도와 관련되어 있으므로 두 가지 문제가 발생합니다. 간단한 질문부터 시작해 보겠습니다. 유닉스 시간은 어디에서 측정됩니까? 만약 앨리스와 밥이 처음부터 현재 시간이 1467932496.42732894722748이라는 것에 동의한다면 그들은 이때 같은 위치에 있는 것입니다. 세슘-133) 원자 수준과 0K), 앨리스는 해수면에 살고 밥은 산에 살거나, 앨리스는 북극에 살고 밥은 적도에 살기 때문에 그들은 쌍둥이 역설에 직면하고 더 이상 더 이상 동의하지 않습니다. 그렇다면 유닉스 시간은 어떻게 정확하게 정의됩니까?
지구가 궤도를 완성하는 시점에 모두가 동의하기 때문에 처음에는 UTC의 문제를 보지 못할 수도 있습니다. (물론 이것은 대륙판의 움직임을 무시하지만 GPS를 사용하면 측정할 수 있기 때문에 이에 대해 꽤 잘 처리할 수 있다고 생각합니다. 그들의 움직임은 매우 정확하여 산, 해수면, 적도 또는 북극에 있든 모델의 고정된 위치에 있고 대륙판의 움직임과 함께 움직이지 않는다고 가정할 수 있습니다. 약간의 시간차가 있을 수 있으나 누적되지는 않습니다.
그러나 두 번째는 9'192'631'770 복사 주기로 정의되는데, 이는 나머지 두 에너지 준위와 0K 사이의 세슘-133 원자의 전이에 해당하며, 세슘-133 원자는 지구의 에너지에 관심이 없습니다. 궤도. 따라서 윤초를 삽입할 위치는 UTC에서 결정하지만, 지구의 궤도 위상과 측정된 시간 사이에는 측정되거나 예측된 오프셋이 있어야 합니다.어딘가에원자시계를 통해. 그게 어디야?
답변1
제목 질문에 대한 실제 답변은 없습니다. Unix 시간은 실제 시간 척도가 아니며 어디에서나 "측정"되지 않습니다. UTC에는 표현할 수 없는 특정 순간이 있기 때문에 비록 열악한 표현이지만 UTC를 표현한 것입니다. Unix 시간은 하루에 86,400초를 요구하지만 UTC는 윤초 때문에 이를 벗어납니다.
더 광범위한 질문에 관해서는 집중해야 할 네 가지 중요한 기간이 있습니다.
UT1(세계시)는 별을 기준으로 한 지구의 자전을 측정하는 전 세계 관측소에서 계산됩니다. 이러한 관찰과 일부 수학을 통해 우리는 그리니치 왕립 천문대의 태양 정오 시간을 기반으로 하는 옛 그리니치 표준시의 보다 현대적인 버전에 도달했습니다. 세계시(Universal Time)는 세계시(Universal Time)라는 조직에서 계산합니다.IERS(국제 지구 회전 및 참조 시스템 서비스, 이전에는 국제 지구 회전 서비스).
타이안(국제 원자시)는 전 세계 수백 개의 원자 시계가 보관하고 국가 표준 기관 및 기타 기관에서 관리합니다. TAI 사용에 기여하는 시계 보관인시간이동시계를 서로 향하도록 유도하여 개별 시계의 작은 오류를 제거하고 전체 시간을 생성하는 기술입니다. SI 단위계의 관리자인 국제도량형국(BIPM)에서 발행한 TAI입니다. 시간 팽창에 대한 질문에 답하기 위해 TAI는 원자 시간으로 정의됩니다.해수면에서(실제로 동일한 아이디어의 고급 버전인 지오이드에서) 각 시계는 자체 고도의 영향을 수정합니다.
UTC(협정 세계시)는 1972년 1월 1일에 TAI보다 10초 늦게 설정되었으며, 그 날짜부터 윤초를 더하거나 빼지 않는 한 TAI와 정확히 동일한 속도로 전진합니다. IERS는 차이를 0.9초 이내로 유지하기 위해 윤초를 선언하기로 결정했습니다(실제로는 약 0.6초 이내. 윤초를 추가하면 차이가 -0.6에서 +0.4로 변경됩니다). 이론적으로 윤초는 양수일 수도 있고 음수일 수도 있지만, SI와 TAI가 정한 표준에 비해 지구의 자전이 느리기 때문에 음수 윤초는 필요하지 않았으며 앞으로도 없을 것입니다.
유닉스 시간, 이는 UTC를 단일 숫자로 표현하는 데 최선을 다합니다. 86,400의 배수인 각 Unix 시간은 UTC 자정에 해당합니다. 모든 UTC 날짜의 길이가 86,400초는 아니지만 "Unix 날짜"는 모두 길이이므로 어떻게든 패치해야 하는 양립할 수 없는 차이가 있습니다. 추가된 윤초에 해당하는 Unix 시간은 없습니다. 실제로 시스템은 이전 초가 두 번 발생한 것처럼 동작하거나(Unix 타임스탬프가 1초 뒤로 이동한 다음 다시 앞으로 이동) 유사한 기술을 적용합니다.점프 스미어이로 인해 윤초의 양쪽에서 시간이 더 길어집니다. 두 경우 모두 약간의 부정확성이 있지만 적어도 두 번째 경우는 단조롭습니다. 두 경우 모두 서로 떨어져 있는 두 Unix 타임스탬프 사이에 경과된 시간입니다.ㅏ그리고두번째같지 않음두번째-ㅏ;동등하다두번째-ㅏ 게다가 중간 윤초.
UT1, TAI, UTC 및 IERS는 모두 글로벌 규모의 다국적 노력이므로 단일 "위치"가 없습니다. 단, IERS Bulletin은 파리 천문대에서 발행되고 BIPM도 파리에 기반을 두고 있는데 이것이 하나의 답입니다. 정확하고 추적 가능한 시간이 필요한 조직은 시간 기반을 "UTC(USNO)"와 같이 선언할 수 있습니다. 이는 타임스탬프가 UTC이고 미국 해군 관측소의 시간에서 파생되었음을 의미하지만 다음 질문을 고려하십시오. Unix 시간에 대해 언급했습니다. 기본적으로 이 수준의 정밀도와 호환되지 않습니다. 정말 정확한 시간을 다루는 사람은 누구나 Unix 시간 대안을 갖게 될 것입니다.
답변2
UNIX 시간은 UNIX를 실행하는 컴퓨터에서 측정됩니다.
이 답변에서는 UTC(협정 세계시), TAI(국제 원자시) 및 SI 초가 무엇인지 알기를 바랍니다. 그들에 대한 설명은훨씬 너머Unix 및 Linux 스택 교환의 범위. 이것은 아니다물리학 또는 천문학 스택 교환.
하드웨어
컴퓨터에는 시계와 타이머를 구동하는 다양한 발진기가 포함되어 있습니다. 세부 사항은 아키텍처에 따라 컴퓨터마다 다릅니다. 그러나 일반적으로 일반적인 용어로 말하면 다음과 같습니다.
- 하나 있다프로그래밍 가능한 간격 타이머(PIT) 어딘가에 특정 진동 수를 계산하고 중앙 처리 장치에 대한 인터럽트를 트리거하도록 프로그래밍할 수 있습니다.
- 하나 있다사이클 카운터CPU에서는 실행되는 각 명령어 주기가 1로 계산됩니다.
넓은 의미의 작동 이론
운영 체제 커널은 PIT를 사용하여 생성합니다.진드기. PIT를 자유 실행으로 설정하고, 100분의 1초 간격으로 정확한 진동 수를 계산하고, 인터럽트를 생성한 다음 자동으로 카운트를 재설정하여 다시 수행합니다. 이에 대해 몇 가지 변형이 있지만 본질적으로 이는 다음과 같은 결과를 낳습니다.진드기고정된 빈도로 인터럽트를 발생시킵니다.
소프트웨어에서 커널은 매 클록 주기마다 카운터를 증가시킵니다. PIT를 먼저 프로그래밍했기 때문에 틱 빈도를 알고 있습니다. 따라서 1초에 몇 개의 틱이 있는지 알 수 있습니다. 이를 사용하여 초를 계산하는 카운터를 증가시킬 시기를 알 수 있습니다. 후자는 "UNIX Time"이라는 커널의 아이디어입니다. 실제로 자체 장치에 남겨두면 SI당 초당 1의 비율로 계산됩니다.
이 문제를 복잡하게 만드는 네 가지 사항이 있는데, 이를 매우 일반적인 용어로 다루겠습니다.
하드웨어가 완벽하지 않습니다. PIT의 데이터시트에 따르면 발진기 주파수는 다음과 같습니다.질소헤르츠 단위의 주파수는 다음과 같습니다.질소.00002Hz, 결과는 명백합니다.
이 방식은 CPU가 초당 수백 번 깨어나고 변수의 숫자를 증가시키는 것 외에는 거의 수행하지 않기 때문에 전원 관리와의 상호 운용성이 매우 낮습니다. 따라서 일부 운영 체제에는 소위 "틱리스" 디자인이 있습니다. PIT가 모든 클록 사이클에 대해 인터럽트를 보내도록 하는 대신, 커널은 스레드 퀀텀 고갈 없이 얼마나 많은 클록 사이클이 경과할지를 (낮은 수준 스케줄러에서) 계산하고 해당 클록 사이클을 미래까지 계산하도록 PIT를 프로그래밍합니다. 틱 인터럽트. 다음을 통해 로그인해야 한다는 것을 알고 있습니다.질소1틱이 아닌 다음 틱 브레이크에 틱을 합니다.
응용 프로그램 소프트웨어는 커널의 현재 시간을 변경할 수 있습니다. 그것은 할 수 있다단계가치가 있거나 할 수 있습니다대학살값. 롤오버에는 초 카운터를 증가시키는 데 필요한 틱 수를 조정하는 작업이 포함됩니다. 따라서 초 카운터는 반드시 SI초당 1의 비율로 계산되지는 않습니다.그래도, 완벽한 발진기를 가정하더라도. 스테핑은 단순히 초 카운터에 새 숫자를 쓰는 것인데, 이는 일반적으로 이전 초가 끝난 후 1 SI 초가 될 때까지 발생하지 않습니다.
최신 커널은 초만 계산하는 것이 아니라 나노초도 계산합니다. 그러나 매 나노초마다 틱으로 중단하는 것은 터무니없고 종종 완전히 실행 불가능합니다. 여기가 비슷한 곳이에요사이클 카운터참여하다. 커널은 매초(또는 모든 클럭 사이클) 주기 카운터 값을 기억하고 다음을 수행할 수 있습니다.현재의시간을 나노초 단위로 알고 싶을 때 카운터 값, 마지막 초(또는 틱) 이후 경과해야 하는 나노초 수. 그러나 명령 주기 빈도가 달라질 수 있어 코어가 HPET(고정밀 이벤트 타이머)와 같은 추가 하드웨어에 의존하게 되므로 전력 및 열 관리로 인해 다시 큰 문제가 발생합니다.
C 언어와 POSIX
C 언어의 표준 라이브러리는 불투명한 유형, 다양한 지정된 필드가 있는 time_t
구조 유형 tm
및 다양한 라이브러리 함수(예: time()
, 및 )를 사용하여 mktime()
시간을 설명합니다 localtime()
.
한마디로 C언어그 자체이는 time_t
사용 가능한 것 중 하나임이 보장됩니다.숫자데이터 유형이며 시차를 계산하는 신뢰할 수 있는 유일한 방법은 함수입니다 difftime()
. POSIX 표준은 더 엄격한 보증을 제공하며 이는 time_t
실제로 다음 중 하나입니다.정수유형 및 개수에포크 이후 초. 이는 또한 timespec
구조 유형을 지정하기 위한 POSIX 표준이기도 합니다 .
이 time()
함수는 때때로 시스템 호출로 설명됩니다. 사실 이것은 오랫동안 많은 시스템에서 낮은 수준의 시스템 호출이 아니었습니다. 예를 들어 FreeBSD에서 기본 시스템 호출은 clock_gettime()
다양한 방법으로 초 또는 초 + 나노초 단위로 측정할 수 있는 다양한 "시계"를 포함하는 입니다. 응용 프로그램 소프트웨어가 커널에서 UNIX 시간을 읽는 것은 이 시스템 호출을 통해 이루어집니다. (일치하는 clock_settime()
시스템 호출을 사용하면 단계를 수행할 수 있고, adjtime()
시스템 호출을 사용하면 종료할 수 있습니다.)
많은 사람들이 POSIX 표준을 사용하고 있으며 그것이 지정하는 내용에 대해 매우 명확하고 정확한 설명을 하고 있습니다. 이런 사람들은 종종 실제로 그렇지 않습니다.읽다POSIX 표준. 그 이론적 근거에 명시된 바와 같이 "에포크 이후 초"(표준에서 사용하는 문구)를 계산한다는 아이디어는,의도적으로gmtime()
POSIX 초가 SI 초와 길이가 같다거나 결과가 "발생에도 불구하고 UTC여야 한다" 는 사양은 없습니다 . POSIX 표준은의도적으로윤초 조정이 발생한 후 1주일 후에 시계를 재설정하여 관리자가 UNIX 시스템에서 윤초 조정을 수동으로 수정할 수 있도록 충분히 완화되었습니다. 실제로 이론적 근거는 시스템의 클럭킹을 수용할 수 있을 만큼 의도적으로 느슨하다는 것입니다.의도적으로 잘못 설정현재 UTC 시간이 아닌 시간입니다.
UTC와 TAI
커널에서 얻은 UNIX 시간의 해석은 애플리케이션에서 실행되는 라이브러리 루틴에 따라 다릅니다. POSIX는 커널 시간과 struct tm
. 2100년 이후의 계산이 잘못되었습니다. 순종하는 것보다 깨는 것이 더 존경스럽다는 말이 쉽게 떠오른다.
물론. 오늘날에는 악명 높은 "Olson Time Zone Database"를 참조하는 Arthur David Olson이 작성한 라이브러리 루틴을 기반으로 이 해석을 기반으로 하는 여러 시스템이 있으며 일반적으로 /usr/share/zoneinfo/
Olson 시스템에는 두 가지 모드가 있습니다.
- 커널의 "에포크 이후 초"는 윤초를 제외한 1970-01-01 00:00:00 UTC 이후의 UTC 초 수로 간주됩니다. 이는
posix/
Olson 시간대 데이터베이스 파일 세트를 사용합니다. 하루 종일 86400 커널 초가 있고, 1분에 61초는 결코 없지만 항상 SI 초의 길이는 아니며, 윤초가 발생하면 커널 시계가 회전하거나 스텝해야 합니다. - 커널의 "에포크 이후 초"는 1970-01-01 00:00:10 TAI 이후의 TAI 초 수로 간주됩니다. 이는
right/
Olson 시간대 데이터베이스 파일 세트를 사용합니다. 커널 초의 길이는 1 SI 초이며 윤초를 조정하기 위해 커널 시계를 회전하거나 계단식으로 조정할 필요가 없지만 세분화 시간은 23:59:60과 같은 값을 가질 수 있으며 일 수 항상 86400 커널 초 길이는 아닙니다.
M. Bernstein은 1970-01-01 00:00:00 TAI 이후의 TAI 초 수를 얻기 위해 단순히 10을 추가하기 때문에 daemontools
필요한 도구 세트를 포함하여 여러 도구를 작성했습니다. 그는 이것을 매뉴얼 페이지에 문서화했습니다.right/
time_t
daemontools-encore
이 요구 사항은 Felix von Leitner 및 와 같은 도구 세트 에 의해 (아마도 무의식적으로) 상속되었습니다 . 사용runit
libowfat
번스타인multilog
,건터multilog
, 또는팟푸svlogd
예를 들어 Olson posix/
구성을 사용하면 모든 TAI64N 타임스탬프가 (작성 당시) 26초 뒤쳐집니다.실제TAI 1970-01-01 00:00:10 TAI 이후의 초 수입니다.
Laurent Bercot와 저는 서로 다른 접근 방식을 취했지만 s6과 nosh에서 이 문제를 해결했습니다. M. 벨코트tai_from_sysclock()
컴파일 타임 플래그에 따라 다릅니다. TAI64N을 처리하는 nosh 도구는 환경 변수를 살펴보고 자동으로 감지 TZ
하고 가능한지 확인합니다.TZDIR
posix/
right/
흥미롭게도 FreeBSD의 문서 time2posix()
와 posix2time()
기능은 Olson right/
모드 와 동일한 TAI 초를 허용합니다 time_t
. 그러나 분명히 활성화되어 있지 않습니다.
다시…
UNIX 시간은 컴퓨터 하드웨어에 포함된 발진기를 사용하여 UNIX를 실행하는 컴퓨터에서 측정됩니다. SI 초를 사용하지 않습니다. 비록 표면적으로는 비슷할 수 있지만 UTC는 아닙니다.의도적으로시계가 잘못되도록 허용하십시오.
추가 읽기
- 다니엘 J. 번스타인.UTC, TAI 및 UNIX 시간. cr.yp.to.
- 다니엘 J. 번스타인.
tai64nlocal
. 데몬 도구. cr.yp.to. - "에포크 이후 초". 단일 UNIX 사양 버전 2. 1997. 오픈그룹.
- "에포크 이후 초 수(기본 원칙)". 기본 사양 Issue 6. 2004. IEEE 1003.1. 그룹을 엽니다.
- 데이비드 마도르(2010-12-17). 유닉스 윤초 혼란.
time2posix
. FreeBSD 10.3 매뉴얼. § 삼.- https://physical.stackexchange.com/questions/45739/
- https://astronomy.stackexchange.com/questions/11840/
답변3
시계 조정은 IERS에서 조정합니다. 그들은 필요에 따라 시간 흐름에 윤초를 삽입하도록 계획합니다.
이것국제 지구 회전 서비스파리 천문대의 IERS(IERS)는 USNO 및 기타 천문대가 제공하는 천문 관측을 사용하여 지구 자전의 불규칙한 변화에 대해 수정된 UT1(Navigator) 시간 척도를 결정합니다.
내가 아는 한, 23:59:60(윤초)과 다음 날 00:00:00은 Unix 시간에서 같은 초로 간주됩니다.