「千年蟲」將會在 2038 年再現!!
對於一眾 90 後的年輕人應該未正正真真接觸、甚至有機會是沒聽說過「千年蟲」,但對於 80 後、70 後應該還會記得二十年前出現的「千年蟲」危機曾經令大家有多恐慌,雖然在 2000 年出現的「千年蟲」已被解決,但並不代表 Bug 不會再出現,下一個「千年蟲」的問題將在 2038 年 1 月 19 日凌晨 3 點 14 分在 32-bit 的 Unix 系統上再現。
「千年蟲」的問題之所以出現,是因為早期的電腦系統都是以 6 位數來儲存時間訊息,即年、月、日各兩位。到了二十世紀即將來臨之際,大家才突然意識到用兩位數字表示年份將導致電腦系統錯誤地將 2000 年識別為 1900 年,因此無法正確辨識公元 2000 年及其以後的年份,而「千年蟲」的影響非常巨大,從電腦系統包括 PC 電腦的 BIOS、微碼到作業系統、資料庫軟體、商用軟體和應用系統等,到與電腦系統和自動控制有關的交換機、銀行自動提款機、保安系統、工廠自動化系統等,乃至使用了嵌入式晶片技術的大量電子電器、機械設備、控制系統等等,全部都會受到「千年蟲」的攻擊。
在臨近 2000 年的時候,全球各地的電腦系統技術人員通過改寫軟件程式繞過了「千年蟲」問題,雖然「千年蟲」最終未演變成一場大災難,實際上沒有給普通市民帶極大的麻煩,但是技術行業卻為此花費了大量的時間及資源作出解決。
當時修復「千年蟲」的方式有兩種:完全重寫代碼,或者採用“windowing”的方式快速修復。“windowing”就是把 00 到 20 之間的所有日期都當做 20XX 年而不是 19XX 年。很顯然,相比於把所有兩位數表示的年份都修改成四位數,後一種方式更省錢、更快而且更容易。
「千年蟲」問題在 2000 年時得到了足夠的重視,但在一些以 Unix 為系統的伺服器、包括以 Unix 為底層的系統上,還有一些小小的缺陷,所有利用 32-bit 數據儲存時間的軟件例如 Unix 都會受到 2038 年新「千年蟲」的問題影響。
當大批工程師在上個世紀七十年代開發出世界上的第一款 Unix 操作系統時,他們做出了一個很隨意的決定,即使用 32-bit 簽名整數(或數字)來代表時間,整個計時系統的起始時間是 1970 年 1 月 1 日,這時的時間值為 0。以後所有的時間都是從這個時間開始一秒一秒累積得來的。
例如時間已經累積到了 919642718 這個數值,就是說這時距離 1970 年 1 月 1 日凌晨 0 時 0 分 0 秒已經過去了 919642718 秒,換算一下就應該是 1999 年 2 月 21 日星期日的 16 時 18 分 38 秒。
這樣計算時間的好處在於,把任意兩個時間值相減之後,就可以很迅速地得到這兩個時間之間相差的秒數,然後你可以利用別的程式把它換算成明白易懂的年月日時分秒的形式。
可能未必每個人都知道,一個 4 字節也就是 32-bit 的儲存空間的最大值是 2147483647,請注意!2038年問題的關鍵也就在這裡———當時間一秒一秒地跳完 2147483647 那驚心動魄的最後一秒後,你猜怎麼樣?
答案是,它就會轉為負數也就是說時間無效。一旦超過了 2147483647 秒這個時間,在 32-bit 的 Unix 系統中,時間就會回到1970 年。
在 32-bit 系統上,time_t 能表示的最大值為 0x7ffffffff,當 time_t 取最大值時表示系統時間為 2038-01-19 03:14:07,但時間再往後走時,那 time_t 會溢出變成一個負值,此時系統時間會倒流重頭開始計算,屆時操作系統和上層軟件都會運行錯出。
2038 年「千年蟲」問題出現的時間會在 2038 年 1 月 19 日 3 點 4 分 18 秒,目前不少商用電腦的作業系統,包括飛機的控制系統及銀行的自動櫃員機均有可能受到影響,當到了 2038 年 1 月 19 日後,這些電腦可能無法顯示正確日期 。
另外對於 64-bit 操作系統,上面還會運行著 32-bit 的應用程式,它的 2038 年問題一樣對系統造成威脅,不可小視。所以 32 位的 time_t 問題,必須要解決,無法自動消失。
幸運的是,這個問題只在 32-bit 系統中才會出現,如果換成 64-bit 系統,最大時間將延長到 9,223,372,036,854,775,807 ,相當於 2923 億年,對人類來說幾乎相當於無限時間了。
雖然目前主流的電腦和智能手機都已經邁向了 64-bit 操作系統,但在此之外還有其他設備底層採用了 Unix 系統,例如某些洗衣機、智能檯燈、智能冷氣或者一些電視等,這些設備同樣會遇到這些 BUG,不僅會是應用層面的影響,而是會影響到最底層的時間控制功能。
不過幸運的是,相隔 2038 年我們還有十幾年時間去解決問題,而有效的解決方法就是在 2038 年之前把所有 32-bit 系統淘汰並改為使用 64-bit 系統,這樣將會巧妙地避開 2038 年的「千年蟲」問題。
至於即將推出的 Linux 5.6 已率先為 2038 年的「千年蟲」問題做好準備,Linux開發人員 Arnd Bergmann 提到,Linux Kernel 5.6 應該作為基礎,使 32-bit 系統能夠運行到 2038 年以後,並提出 PR 包括對 time_t 的更改,即更改儲存秒數(帶符號的 32-bit 整數)。
為了避免 2038 年「千年蟲」的問題,Arnd Bergmann 表示,用戶空間應用程式需要使用現代 Linux Kernel 內核系統調用,並且需要使用 GNU C Library 2.32 及 Musl libc 1.2 針對 64-bit time_t 構建用戶空間。