Linux中國

Unix 即將迎來 50 歲

對於 Unix 而言,2020 年是重要的一年。在這一年年初,Unix 進入 50 歲。

儘管 Unix 的某些早期開發早於其「紀元」的正式開始,但 1970 年 1 月 1 日仍然是 POSIX 時間的零點,也是公認的 Unix 的萬物之始。自那一刻算起,2020 年 1 月 1 日將是其 50 周年。(LCTT 譯註:實際上,在 1971/11/3 出版的第一版《Unix 程序員手冊》中,將 1971/1/1 作為 Unix 紀元的開始,並且一秒鐘記錄 60 個數,但是後來發現這樣 32 位整型數字只能記錄兩年多,後來這個紀元被一再重新定義,改為從 1970/1/1 開始,每秒 1 個數。)

Unix 時間與人類時間

就人類時間而言,50 年是很重要的。就 Unix 時間而言,50 年沒有什麼特別的。48.7 年同樣重要。

Unix(包括 Linux)系統將日期/時間值存儲為自 1970-01-01 00:00:00 UTC 以來經過的秒數(32 位整型)。要確定自該時間以來經過了多少秒鐘,看看 Unix 時間值是什麼樣子,你可以發出如下命令:

$ date +%s
1576883876

%s 參數告訴 date 命令將當前日期/時間顯示為自 1970-01-01 開始以來的秒數。

Unix 系統可以管理多少時間?

要了解 Unix 系統可以容納多少時間,我們需要查看 32 位欄位的容量。可以這樣計算:

$ echo '2^32' | bc
4294967296

但是,由於 Unix 需要容納負數,因此它會為數字的符號保留一位,從而將其減少為:

$ echo '2^31' | bc
2147483648

並且,由於 Unix 計數以 0 開頭,這意味著我們有 2,147,483,648 個值,但最大的可能值為 2,147,483,647 個。Unix 日期/時間值不能超過該數字——就像汽車上的里程錶可能不能超過 999,999 英里一樣。加 1 該值就變為了 -2147483648。(LCTT 譯註:此處原文描述有誤,已修改。在達到最大值之後,即 2038/1/19 03:14:07,下 1 秒導致符號位變為 1,其餘 31 位為 0,即 -2147483648,時間變為 1901/12/13 20:45:52,這就是 Y2K38 問題。)

一年有多少秒?

大多數年份的秒數可以這樣計算:每天的小時數乘以每小時的分鐘數乘以每分鐘的秒數乘以一年中的天數:

$ expr 24 * 60 * 60 * 365
31536000

在閏年,我們再增加一天:

$ expr 24 * 60 * 60 * 366
31622400

(LCTT 譯註:Unix 時間將一天精確定義為 24 60 60 = 86400 秒,忽略閏秒。)

Unix 將如何慶祝其 50 歲生日?

2020 年 1 月 1 日中午 12:00 是紀元時間的 1577836800。這個計算有些棘手,但主要是因為我們必須適應閏年。自該紀元開始以來,我們經歷了 12 個閏年,從 1972 年開始,到上一個閏年是 2016 年。而且,當我們達到 2020 年時,我們將有 38 個常規年份。

這是使用 expr 命令進行的計算,以計算這 50 年的秒數:

$ expr 24 * 60 * 60 * 365 * 38 + 24 * 60 * 60 * 366 * 12
1577836800

前半部分是計算 38 個非閏年的秒數。然後,我們加上閏年的 366 天的類似計算。或者,你可以使用前面介紹的每年秒數,然後執行以下操作:

$ expr 31536000 * 38 + 31622400 * 12
1577836800

這種跟蹤日期和時間的方式使 Unix 系統完全不受 Y2K 恐慌的影響,1999 年末人們開始擔心進入 2000 年會對計算機系統造成嚴重破壞,但是實際遇到的問題比人們擔心的少得多。實際上,只有以兩位數格式存儲年份的應用程序才會將年份變為 00,以表示時間倒退。儘管如此,許多應用程序開發人員還是做了很多額外的繁瑣工作,以確保 2000 年到來時,他們的系統不會出現嚴重問題。

Unix 時間何時會遇到問題?

在 2038 年之前,Unix 系統不會遇到 Y2K 類型的問題,直到如上所述存儲的日期將超過其 32 位空間分配。但這距離現在已經只有 18 年了,內核開發人員已經在研究如何避免災難。但現在開始恐慌還為時過早。

2038 年的問題有時稱為 Y2K38 問題。我們必須在 2038 年 1 月 19 日星期二之前解決這個問題。如果問題到時候仍未解決,則該日期之後的系統可能會認為是 1901 年。解決該問題的一種方法是切換為日期/時間信息的 64 位表示形式。有些人認為,即使那樣,也會有比聽起來更複雜的問題。無論如何,恐慌還為時過早。並且,與此同時,也許在新年前夜演唱了《Auld Lang Syne》之後,你可以向 Unix 唱《生日快樂》歌了。Unix 50 歲了,這仍然是大事。

(LCTT 譯註:建議閱讀一下 Unix 時間的維基百科頁面,有更多有趣和不為人知的信息。)

via: https://www.networkworld.com/article/3511428/unix-is-turning-50-what-does-that-mean.html

作者:Sandra Henry-Stocker 選題:lujun9972 譯者:wxy 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國