Thời gian Unix / Thời gian chính thức được đo ở đâu? [đóng cửa]


20

Tuyên bố từ chối điều:

Tôi vừa xem qua danh sách các trang web StackExchange trong khoảng 20 phút cố gắng tìm ra nơi để đăng bài này. Nếu bạn biết bất kỳ trang web nào phù hợp hơn, xin vui lòng chuyển câu hỏi này đến đó. Tôi đang đăng bài này ở đây vì thời gian unix khiến tôi suy nghĩ.


Vì vậy, như chúng ta đã biết, có thời gian unix và có UTC. Thời gian Unix chỉ tiếp tục tích tắc, đếm giây - một giây mỗi giây - trong khi UTC cố gắng giữ thời gian ở các định dạng có thể đọc được mà chúng ta sử dụng phù hợp với pha của Trái đất trong vòng quay của nó. Để làm điều này, UTC chèn từng giây từng giây.

Vì thời gian có liên quan đến lực hấp dẫn mà vật thể trải qua thời gian tiếp xúc, các loại gia tốc khác và tốc độ tương đối, điều này dẫn đến 2 câu hỏi. Trước tiên, hãy vượt qua điều đơn giản: Thời gian unix được đo ở đâu? Nếu Alice và Bob bắt đầu đồng ý thì thời điểm hiện tại là 1467932496.42732894722748 khi họ ở cùng một nơi (một giây tất nhiên được xác định là 9'192'631'770 chu kỳ bức xạ tương ứng với sự chuyển đổi giữa hai mức năng lượng của Caesium-133 nguyên tử ở trạng thái nghỉ và ở 0 K), trải qua một nghịch lý sinh đôi do Alice sống ở mực nước biển và Bob sống ở trên núi hoặc Alice sống ở cực bắc và Bob sống ở xích đạo, họ sẽ không đồng ý nữa. Vậy làm thế nào là thời gian unix được xác định chính xác?

Ban đầu bạn có thể không thấy vấn đề với UTC vì chắc chắn mọi người đều có thể đồng ý khi trái đất hoàn thành một quỹ đạo (điều này tất nhiên là bỏ qua chuyển động của mảng lục địa nhưng tôi nghĩ rằng chúng ta đã hiểu được điều đó khá tốt bởi vì GPS có thể đo được chuyển động của họ rất chính xác và chúng ta có thể giả sử chúng ở vị trí đã đặt trong mô hình của chúng ta và không di chuyển khi các mảng lục địa dịch chuyển), bất kể chúng ở trên núi, trên mực nước biển, trên đường xích đạo hay ở cực bắc. Có thể có một số khác biệt về thời gian nhưng chúng không tích lũy.

Nhưng một giây được định nghĩa là 9'192'631'770 chu kỳ bức xạ tương ứng với sự chuyển đổi giữa hai mức năng lượng của nguyên tử Caesium-133 khi nghỉ và ở nguyên tử 0 K và Caesium-133 không quan tâm đến quỹ đạo của trái đất. Vì vậy, UTC quyết định nơi sẽ chèn một bước nhảy vọt nhưng phải có sự thay đổi được đo lường hoặc dự đoán giữa pha của quỹ đạo trái đất và thời gian được đo ở đâu đó bằng đồng hồ nguyên tử. Đó là đâu đó?


5
"Thời gian Unix chỉ tiếp tục tích tắc, đếm giây - một giây mỗi giây" - thực tế, nó không. Mọi thứ sẽ đơn giản hơn nếu nó đã làm.
hobbs

3
Câu hỏi tôi nghĩ bạn muốn hỏi có lẽ là về chủ đề Vật lý - nhưng đó là câu hỏi về tiêu chuẩn thời gian, như UTC, và không liên quan gì đến thời gian UNIX. Xem thêm cái nàycái này và những câu hỏi liên quan khác.
David Z

7
Tôi đang bỏ phiếu để đóng câu hỏi này ngoài chủ đề vì nó liên quan đến vật lý, chính trị và các tiêu chuẩn tạm thời, nhưng không phải là Unix.
Michael Homer

3
lẽ có một câu hỏi về chủ đề ở đâu đó trong lĩnh vực này mà bạn có thể đã hỏi, nhưng tôi không nghĩ rằng đây là nó. Nó chỉ có "... còn Unix thì sao?" thỉnh thoảng ném vào một câu hỏi không liên quan, như các câu trả lời minh họa.
Michael Homer

Câu trả lời:


30

Câu hỏi tiêu đề của bạn không có câu trả lời thực sự; Thời gian Unix không phải là thời gian thực và không "đo" ở bất cứ đâu. Đó là một đại diện của UTC, mặc dù là một người nghèo vì có những khoảnh khắc trong UTC mà nó không thể đại diện. Thời gian Unix khăng khăng rằng có 86.400 giây mỗi ngày, nhưng UTC đi chệch khỏi đó do những giây nhuận.

Đối với câu hỏi rộng hơn của bạn, có bốn khoảng thời gian quan tâm quan tâm:

  1. UT1 (Giờ toàn cầu), được tính toán bởi các đài quan sát trên khắp thế giới, đo lường sự quay của Trái đất đối với các ngôi sao cố định. Với những quan sát này và một chút toán học, chúng ta có được một phiên bản hiện đại hơn của Giờ trung bình Greenwich cũ, dựa trên khoảnh khắc buổi trưa của mặt trời tại Đài thiên văn Hoàng gia ở Greenwich. Giờ quốc tế được tính bởi một tổ chức có tên là IERS (Dịch vụ hệ thống tham chiếu và quay trái đất quốc tế, trước đây là Dịch vụ xoay vòng trái đất quốc tế).

  2. TAI (Giờ nguyên tử quốc tế), được lưu giữ bởi hàng trăm đồng hồ nguyên tử trên khắp thế giới, được duy trì bởi các cơ quan tiêu chuẩn quốc gia và như vậy. Những người giữ đồng hồ góp phần vào TAI sử dụng các kỹ thuật chuyển thời gian để điều khiển đồng hồ của họ hướng về nhau, loại bỏ bất kỳ lỗi nhỏ nào của đồng hồ riêng lẻ và tạo ra thời gian đồng bộ; tập hợp đó là TAI, được xuất bản bởi Cục Trọng lượng và Đo lường Quốc tế (BIPM), người quản lý của hệ thống đơn vị SI. Để trả lời câu hỏi của bạn về sự giãn nở thời gian, TAI được định nghĩa là thời gian nguyên tử ở mực nước biển (thực ra, ở Geoid, là phiên bản huyền ảo hơn của cùng một ý tưởng) và mỗi đồng hồ điều chỉnh các hiệu ứng về độ cao của chính nó.

  3. UTC (Giờ phối hợp quốc tế). UTC đã được đặt bằng mười giây sau TAI vào ngày 1 tháng 1 năm1972 và kể từ ngày đó, nó sẽ chuyển tiếp với tốc độ chính xác như TAI, ngoại trừ khi một giây nhảy vọt được thêm hoặc trừ. IERS đưa ra quyết định công bố bước nhảy vọt thứ hai để giữ chênh lệch trong vòng 0,9 giây (trong thực tế, trong khoảng 0,6 giây; bước nhảy vọt thêm vào khiến chênh lệch tăng từ -0,6 đến + 0,4). Về lý thuyết, giây nhuận có thể là cả tích cực và tiêu cực, nhưng vì vòng quay của trái đất đang chậm lại so với tiêu chuẩn do SI và TAI thiết lập, nên một bước nhảy vọt tiêu cực chưa bao giờ là cần thiết và có lẽ sẽ không bao giờ.

  4. Thời gian Unix, đó là cách tốt nhất để đại diện cho UTC là một số duy nhất. Mỗi lần Unix là bội số của 86.400 tương ứng với UTC nửa đêm. Vì không phải tất cả các ngày UTC đều dài 86.400 giây, nhưng tất cả "ngày Unix" đều có một sự khác biệt không thể hòa giải được phải được khắc phục bằng cách nào đó. Không có thời gian Unix tương ứng với một bước nhảy vọt thứ hai. Trong thực tế, các hệ thống sẽ hoạt động như thể lần thứ hai xảy ra hai lần (với dấu thời gian unix nhảy lùi lại một giây, sau đó tiếp tục tiến lên một lần nữa) hoặc áp dụng một kỹ thuật như nhảy vọt thời gian trong một khoảng thời gian dài hơn ở hai bên một bước nhảy vọt. Trong cả hai trường hợp có một số không chính xác, mặc dù ít nhất cái thứ hai là đơn điệu. Trong cả hai trường hợp,b không bằng ba; nó bằng ba cộng với số giây nhảy vọt xen kẽ .

Vì UT1, TAI, UTC và IERS đều trên toàn thế giới, những nỗ lực đa quốc gia, không có "nơi nào", mặc dù các bản tin IERS được xuất bản từ Đài thiên văn Paris và BIPM cũng có trụ sở tại Paris, đó là một câu trả lời. Một tổ chức yêu cầu thời gian chính xác, có thể theo dõi có thể xác định cơ sở thời gian của họ giống như "UTC (USNO)", có nghĩa là dấu thời gian của họ ở UTC và chúng xuất phát từ thời điểm tại Đài thiên văn Hải quân Hoa Kỳ, nhưng đưa ra những vấn đề mà Tôi đã đề cập đến thời gian Unix, về cơ bản nó không tương thích với mức độ chính xác đó - bất kỳ ai xử lý thời gian thực sự chính xác sẽ có một sự thay thế cho thời gian Unix.


1
Bạn đã bỏ qua sự tồn tại của các right/múi giờ trong hệ thống Olson và cách chúng quan tâm time_t.
JdeBP

1
@JdeBP Tôi thực sự đã không nghe nói về điều đó. Tôi nghĩ rằng sẽ hơi mơ hồ khi gọi đó là thời gian Unix khi nó rõ ràng đi ngược lại cả POSIX và quy ước lâu đời, nhưng dù sao đó cũng là thông tin có giá trị. Có lẽ bạn có thể thêm một câu trả lời về nó?
hobbs

1
Cách dễ nhất để có được nguồn thời gian chính xác cao cho người bình thường là máy thu GPS. Đồng hồ trên các vệ tinh được đồng bộ hóa với TAI và tín hiệu chính xác đến khoảng 10 giây (không cần hiệu chỉnh; với hiệu chỉnh có thể được cải thiện thành 10⁻¹⁰).
Jan Hudec

1
@JanHudec Không giống như người bình thường có thể nói sự khác biệt giữa đồng hồ chính xác đến 10⁻² hoặc 10⁻¹⁰.
gerrit

1
Chỉ là một gợi ý về lý do tại sao UNIX không bao gồm hỗ trợ thứ hai. Điều này đã được thảo luận nhiều lần trong hội thảo từ xa của Tập đoàn Austin và kết quả là việc thêm hỗ trợ cho những giây nhuận sẽ gây ra nhiều vấn đề hơn là bỏ qua hỗ trợ sẽ gây ra.
schily

12

Các điều chỉnh cho đồng hồ được phối hợp bởi IERS. Họ lên lịch chèn một bước nhảy vọt vào dòng thời gian theo yêu cầu.

Từ NTP Timescale và Leap giây

Các Trái đất xoay Dịch vụ Quốc tế (IERS) tại Đài quan sát Paris sử dụng quan sát thiên văn được cung cấp bởi USNO và đài quan sát khác để xác định khoảng thời gian UT1 (navigator của) điều chỉnh cho các biến thể bất thường trong vòng quay trái đất.

Theo hiểu biết tốt nhất của tôi 23:59:60 (Bước nhảy vọt thứ hai) và 00:00:00 ngày hôm sau được coi là cùng một giây trong Thời gian Unix.


8

Thời gian UNIX được đo trên máy tính của bạn, chạy UNIX.

Câu trả lời này sẽ mong bạn biết được Giờ thế giới chung (UTC), Giờ nguyên tử quốc tế (TAI) và giây thứ hai là gì. Giải thích chúng vượt ra ngoài phạm vi của Unix và Linux Stack Exchange. Đây không phải là trao đổi ngăn xếp vật lý hoặc thiên văn.

Phần cứng

Máy tính của bạn chứa các bộ dao động khác nhau điều khiển đồng hồ và bộ hẹn giờ. Chính xác những gì nó đã thay đổi từ máy tính này sang máy tính khác tùy thuộc vào kiến ​​trúc của nó. Nhưng thông thường, và trong điều khoản rất chung chung:

  • Có một bộ định thời khoảng thời gian lập trình (PIT) ở đâu đó, có thể được lập trình để đếm một số dao động nhất định và kích hoạt ngắt đến bộ xử lý trung tâm.
  • Có một bộ đếm chu kỳ trên bộ xử lý trung tâm chỉ đơn giản là đếm 1 cho mỗi chu kỳ lệnh được thực thi.

Lý thuyết hoạt động, theo nghĩa rất rộng

Nhân hệ điều hành sử dụng PIT để tạo ra các dấu tick . Nó thiết lập thuế TNCN để chạy tự do, đếm đúng số lượng dao động trong một khoảng thời gian, giả sử, một phần trăm giây, tạo ra một ngắt, sau đó tự động đặt lại số đếm để đi lại. Có các biến thể về điều này, nhưng về bản chất, điều này gây ra một ngắt đánh dấu được nâng lên với tần số cố định.

Trong phần mềm, kernel tăng một bộ đếm mỗi tích tắc. Nó biết tần số đánh dấu, bởi vì nó đã lập trình thuế TNCN ở vị trí đầu tiên. Vì vậy, nó biết có bao nhiêu tick tạo nên một giây. Nó có thể sử dụng điều này để biết khi nào tăng một bộ đếm đếm giây. Đây là ý tưởng của hạt nhân về "Thời gian UNIX". Thực tế, nó chỉ đơn giản là đếm ngược lên với tốc độ một trên mỗi giây SI nếu để lại các thiết bị của chính nó.

Bốn điều phức tạp này, mà tôi sẽ trình bày dưới dạng rất chung chung.

Phần cứng không hoàn hảo. Một PIT có bảng dữ liệu nói rằng nó có tần số dao động là N Hertz thay vào đó có tần số (giả sử) N .00002 Hertz, với các hậu quả rõ ràng.

Sơ đồ này tương tác rất kém với quản lý năng lượng, bởi vì CPU đang thức dậy hàng trăm lần mỗi giây để làm ít hơn là tăng một số trong một biến. Vì vậy, một số hệ điều hành có những gì được gọi là thiết kế "không có dấu vết". Thay vì làm cho PIT gửi một ngắt cho mỗi tick, kernel hoạt động (từ bộ lập lịch mức thấp) có bao nhiêu tick sẽ trôi qua mà không có lượng tử luồng nào, và lập trình PIT để tính cho nhiều tick đó vào tương lai trước khi phát hành một đánh dấu ngắt. Nó biết rằng sau đó nó phải ghi lại đoạn N tick ở lần ngắt tiếp theo, thay vì 1 tick.

Phần mềm ứng dụng có khả năng thay đổi thời gian hiện tại của kernel. Nó có thể bước giá trị hoặc nó có thể xoay giá trị. Slewing liên quan đến việc điều chỉnh số lượng bọ ve phải đi để tăng bộ đếm giây. Vì vậy, các giây truy cập không nhất thiết phải đếm theo tỷ lệ một trong mỗi SI thứ hai nào , thậm chí giả tạo dao động hoàn hảo. Bước bao gồm chỉ đơn giản là viết một số mới trong bộ đếm giây, điều này thường không xảy ra cho đến 1 SI giây kể từ giây cuối cùng được đánh dấu.

Hạt nhân hiện đại không chỉ đếm giây mà còn đếm nano giây. Nhưng thật nực cười và thường hoàn toàn không khả thi khi bị gián đoạn đánh dấu một lần trên mỗi nano giây. Đây là nơi mà những thứ như bộ đếm chu kỳ phát huy tác dụng. Hạt nhân ghi nhớ giá trị bộ đếm chu kỳ ở mỗi giây (hoặc tại mỗi tích tắc) và có thể hoạt động, từ giá trị hiện tại của bộ đếm khi có thứ gì đó muốn biết thời gian tính bằng nano giây, phải mất bao nhiêu nano giây kể từ giây cuối cùng (hoặc đánh dấu). Mặc dù vậy, một lần nữa, quản lý năng lượng và nhiệt đóng vai trò quan trọng vì tần số chu kỳ hướng dẫn có thể thay đổi, do đó, hạt nhân làm những việc như dựa vào phần cứng bổ sung như (giả sử) Bộ đếm thời gian chính xác cao (HPET).

Ngôn ngữ C và POSIX

Các thư viện chuẩn của ngôn ngữ C mô tả thời gian trong điều khoản của một loại đục, time_t, một loại cấu trúc tmvới các lĩnh vực cụ thể khác nhau, và chức năng thư viện khác nhau như time(), mktime(), và localtime().

Tóm lại: bản thân ngôn ngữ C chỉ đảm bảo rằng đó time_tlà một trong những loại dữ liệu số có sẵn và cách duy nhất đáng tin cậy để tính chênh lệch thời gian là difftime()hàm. Đó là tiêu chuẩn POSIX cung cấp các đảm bảo chặt chẽ hơn time_ttrên thực tế là một trong các loại số nguyên và nó tính số giây kể từ Kỷ nguyên . Nó cũng là tiêu chuẩn POSIX chỉ định timespecloại cấu trúc.

Các time()chức năng đôi khi được mô tả như một cuộc gọi hệ thống. Trên thực tế, ngày nay nó không phải là cuộc gọi hệ thống cơ bản trên nhiều hệ thống. Ví dụ, trên FreeBSD, cuộc gọi hệ thống cơ bản là clock_gettime(), có nhiều "đồng hồ" khác nhau có sẵn tính bằng giây hoặc giây + nano giây theo nhiều cách khác nhau. Đây là hệ thống gọi phần mềm ứng dụng này đọc Thời gian UNIX từ kernel. (Cuộc clock_settime()gọi hệ thống phù hợp cho phép họ thực hiện adjtime()cuộc gọi và cuộc gọi hệ thống cho phép họ thực hiện cuộc gọi đó.)

Nhiều người vẫy tiêu chuẩn POSIX xung quanh với những tuyên bố rất chắc chắn và chính xác về những gì nó quy định. Những người như vậy, thường xuyên hơn không, không thực sự đọc tiêu chuẩn POSIX. Như lý do của nó đặt ra, ý tưởng đếm "giây kể từ Kỷ nguyên", đó là cụm từ mà tiêu chuẩn sử dụng, cố ý không xác định rằng POSIX giây có cùng độ dài với SI giây, cũng không phải là kết quả của gmtime()"nhất thiết UTC, mặc dù xuất hiện ". Tiêu chuẩn POSIX là cố ýđủ lỏng để nó cho phép (nói) một hệ thống UNIX nơi người quản trị đi và tự sửa các bước điều chỉnh thứ hai bằng cách cài đặt lại đồng hồ vào tuần sau khi chúng xảy ra. Thật vậy, lý do chỉ ra rằng nó cố tình lỏng lẻo đủ để chứa các hệ thống mà đồng hồ đã bị cố tình đặt sai vào một thời điểm nào đó ngoài thời gian UTC hiện tại.

UTC và TAI

Việc giải thích Thời gian UNIX thu được từ kernel tùy thuộc vào thói quen của thư viện đang chạy trong các ứng dụng. POSIX chỉ định danh tính giữa thời gian của hạt nhân và "thời gian bị hỏng" trong a struct tm. Nhưng, như Daniel J. Bernstein đã từng chỉ ra, phiên bản năm 1997 của tiêu chuẩn đã nhận dạng sai một cách đáng xấu hổ, làm xáo trộn quy tắc năm nhuận của Lịch Gregorian (điều mà học sinh học được) để tính toán bị lỗi từ năm 2100 trở đi. "Vinh dự hơn trong vi phạm hơn là tuân thủ" là một cụm từ dễ hiểu.

Và thực sự nó là. Một số hệ thống hiện nay dựa trên diễn giải thư viện này do Arthur David Olson viết, tham khảo "cơ sở dữ liệu múi giờ Olson" khét tiếng, thường được mã hóa trong các tệp cơ sở dữ liệu /usr/share/zoneinfo/. Hệ thống Olson có hai chế độ:

  • "Số giây kể từ Kỷ nguyên" của hạt nhân được coi là đếm giây UTC kể từ 1970-01-01 00:00:00 UTC, ngoại trừ giây nhuận. Điều này sử dụng posix/tập hợp các tệp cơ sở dữ liệu múi giờ Olson. Tất cả các ngày có 86400 giây hạt nhân và không bao giờ có 61 giây trong một phút, nhưng chúng không phải luôn luôn là độ dài của giây SI và đồng hồ hạt nhân cần xoay hoặc bước khi xảy ra bước nhảy vọt.
  • "Số giây kể từ kỷ nguyên" của hạt nhân được coi là tính số giây TAI kể từ 1970-01-01 00:00:10 TAI. Điều này sử dụng right/tập hợp các tệp cơ sở dữ liệu múi giờ Olson. Kernel giây dài 1 SI giây và đồng hồ kernel không bao giờ cần xoay hoặc bước để điều chỉnh trong giây nhuận, nhưng thời gian bị hỏng có thể có các giá trị như 23:59:60 và ngày không phải luôn luôn dài 86400 giây.

M. Bernstein đã viết một số công cụ, bao gồm cả daemontoolsbộ công cụ của mình , điều đó là cần thiết right/bởi vì họ chỉ cần thêm 10 time_tđể có được TAI giây kể từ 1970-01-01 00:00:00 TAI. Ông đã ghi lại điều này trong trang hướng dẫn.

Yêu cầu này (có lẽ vô tình) được kế thừa bởi các bộ công cụ như daemontools-encorerunitvà của Felix von Leitner libowfat. Ví dụ, sử dụng Bernsteinmultilog , Guentermultilog hoặc Papesvlogd với posix/cấu hình Olson và tất cả các dấu thời gian TAI64N sẽ (tại thời điểm viết này) 26 giây sau số đếm TAI thực tế kể từ 1970-01-01 00:00:10 TAI.

Laurent Bercot và tôi đã giải quyết vấn đề này trong s6 và nosh, mặc dù chúng tôi đã thực hiện các phương pháp khác nhau. M. Bercot tai_from_sysclock()dựa vào một lá cờ thời gian biên dịch. các công cụ nosh xử lý trong TAI64N xem xét các biến TZTZDIRmôi trường để tự động phát hiện posix/right/nếu chúng có thể.

Thật thú vị, các tài liệu time2posix()posix2time()chức năng FreeBSD cho phép tương đương right/với chế độ Olson với số time_tgiây TAI. Họ không rõ ràng được kích hoạt, tuy nhiên.

Một lần nữa…

Thời gian UNIX được đo trên máy tính của bạn chạy UNIX, bằng các bộ dao động có trong phần cứng máy tính của bạn. Nó không sử dụng SI giây; nó không phải là UTC mặc dù nó có thể rất giống với nó; và nó cố ý cho phép đồng hồ của bạn bị sai.

đọc thêm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.