2017年06月18日 15:22:52
前幾天在飽覽書籍的過(guò)程中,饒有興致的注意到一個(gè)在歷史上曾經(jīng)叱咤過(guò)全球的嚴(yán)重計(jì)算機(jī)BUG,于是記錄下來(lái),等待以后入坑
什么是千年蟲(Y2K)問(wèn)題千年蟲-百度百科
計(jì)算機(jī)2000年問(wèn)題,又叫做“千年蟲”、“電腦千禧年千年蟲問(wèn)題”或“千年危機(jī)”??s寫為“Y2K”。是指在某些使用了計(jì)算機(jī)程序的智能系統(tǒng)(包括計(jì)算機(jī)系統(tǒng)、自動(dòng)控制芯片等)中,由于其中的年份只使用兩位十進(jìn)制數(shù)來(lái)表示,因此當(dāng)系統(tǒng)進(jìn)行(或涉及到)跨世紀(jì)的日期處理運(yùn) 算時(shí)(如多個(gè)日期之間的計(jì)算或比較等),就會(huì)出現(xiàn)錯(cuò)誤的結(jié)果,進(jìn)而引發(fā)各種各樣的系統(tǒng)功 能紊亂甚至崩潰。因此從根本上說(shuō)千年蟲是一種程序處理日期上的bug(計(jì)算機(jī)程序故障),而非病毒。
舉個(gè)例子
千年蟲是在計(jì)算機(jī)中對(duì)于年份和日期的表示方式不完整而引起的程序出錯(cuò),它包含三個(gè)方面的內(nèi)容:
1. 由于只使用了兩位數(shù)來(lái)表示年份,會(huì)引起跨世紀(jì)的日期計(jì)算得出錯(cuò)誤結(jié)果,比如用02減去98會(huì)得-96,而用2002減去1998結(jié)果是4。
2. 由于特殊日期(9/9/99)和計(jì)算機(jī)中特殊定義的字符串相沖突而有可能引起操作錯(cuò)誤。
3. 閏年問(wèn)題,即能否正確計(jì)算2000年是閏年,2月份有29日這一天。
根據(jù)以上三個(gè)方面的表現(xiàn),我們可以肯定地說(shuō),千年蟲在所有使用了智能程序進(jìn)行有關(guān)日期的處理和操作的地方都有可能發(fā)作。
舉個(gè)例子來(lái)說(shuō),對(duì)于一部星期一至星期五工作時(shí)間開放、星期六、日下班時(shí)間關(guān)閉的定時(shí)開關(guān)電梯來(lái)說(shuō),由于它能夠定時(shí)開關(guān),電梯里必定有智能程序,同時(shí)智能程序中也必定有和日期有關(guān)的操作,才能夠計(jì)算出一年中每個(gè)月的每一天是星期幾,那么當(dāng)2000年來(lái)臨時(shí),如果這部電梯因?yàn)橹皇褂昧藘晌粩?shù)來(lái)表示年份,就會(huì)將2000年識(shí)別為1900年,從而帶來(lái)其中的日歷計(jì)算錯(cuò)誤,造成電梯的自動(dòng)功能紊亂。
千年蟲主要集中發(fā)作于兩個(gè)方面: 一個(gè)是配備比較早(大約在80年代中期以前投入使用)的主機(jī)上的應(yīng)用系統(tǒng),如在IBM 4381,IBM AS/400等機(jī)型上運(yùn)行的應(yīng)用程序。這些機(jī)器系統(tǒng)國(guó)際上都應(yīng)用的相當(dāng)早,因此其上面的應(yīng)用程序經(jīng)過(guò)十余年的開發(fā)和發(fā)展其規(guī)模已經(jīng)非常龐大,比如美國(guó)的AT&T電訊公司,其內(nèi)部就有超過(guò)3.6億行的應(yīng)用程序需要檢測(cè)是否存在2000年問(wèn)題,這確實(shí)是很大的工作量,因此給解決2000年問(wèn)題造成了極大的麻煩。 千年蟲另外一個(gè)容易發(fā)作的方面是嵌入式設(shè)備。所謂嵌入式設(shè)備,就是指設(shè)備中使用了智能芯片的系統(tǒng),由于智能芯片價(jià)格低廉,目前嵌入式設(shè)備已變成無(wú)處不在,由生產(chǎn)線、大量的自動(dòng)化儀器儀表、汽車、電梯、警報(bào)系統(tǒng)、消防檢測(cè)器到醫(yī)療設(shè)備,以至電話交換機(jī)、空調(diào)機(jī)、交通燈、恒溫器等,可謂滲透到日常生活每個(gè)角落。這些設(shè)備中應(yīng)用的程序往往都已經(jīng)固化到元器件中,因此一旦產(chǎn)品只使用了兩位數(shù)來(lái)表示年份,就會(huì)引發(fā)2000年問(wèn)題,而要替換這些芯片,又往往不得不把整個(gè)系統(tǒng)都替換,這會(huì)造成資金和操作上的困難,使解決2000年問(wèn)題更加麻煩,也是無(wú)法按時(shí)解決2000年問(wèn)題的隱患之一。
Y2K問(wèn)題給2000年造成的危害還是挺大的,隨著時(shí)間的推移2038年問(wèn)題也引起了人們的注意。。。。
2038年問(wèn)題2038年問(wèn)題-維基百科
和21世紀(jì)初的千年蟲(the Millennium bug)問(wèn)題類似,32位的Unix操作系統(tǒng)和Linux操作系統(tǒng)時(shí)間溢出問(wèn)題又稱為2038年問(wèn)題(the Year 2038 problem)。如果你想知道什么是2038問(wèn)題的話,你需要知道一些技術(shù)上的東西。這個(gè)bug是由用來(lái)寫Unix/Linux的C語(yǔ)言引起的,C語(yǔ)言中用 time_t 來(lái)代表時(shí)間和日期,time_t 是整數(shù)(int)型的,它用來(lái)記載從1970年1月1日到2000年所經(jīng)歷的秒數(shù)。
在2038年的問(wèn)題是在該時(shí)間值存儲(chǔ)或計(jì)算為計(jì)算和數(shù)據(jù)存儲(chǔ)的情況下的一個(gè)問(wèn)題符號(hào)的32位整數(shù),并且因?yàn)檫@個(gè)00:00:00數(shù)被解釋為秒數(shù)UTC 1 1970年1月(在歷元)。[1]這樣的實(shí)現(xiàn)不能在19后3點(diǎn)14分07秒U(xiǎn)TC編碼倍2038年1月,類似但不完全類似于一個(gè)問(wèn)題2000年問(wèn)題(也被稱為千年蟲),其中2位的值代表數(shù)字年自1900年以來(lái)未能編碼2000年或以后。大多數(shù)32位的 類Unix系統(tǒng)來(lái)存儲(chǔ)和處理在這段時(shí)間Unix時(shí)間格式,因此2038年的問(wèn)題是有時(shí)被稱為Unix的千年蟲的關(guān)聯(lián)。
原理
在計(jì)算機(jī)應(yīng)用上,2038年問(wèn)題可能會(huì)導(dǎo)致某些軟件在2038年無(wú)法正常工作。所有使用 POSIX (可移植性操作系統(tǒng)接口 )時(shí)間表示時(shí)間的程序都將受其影響,因?yàn)樗鼈兊臅r(shí)間起點(diǎn)是格林尼治時(shí)間1970年1月1日0時(shí)0分0秒(這個(gè)時(shí)間名叫 the Unix Epoch),它們用the Unix Epoch經(jīng)過(guò)的秒數(shù)(忽略閏秒)來(lái)表示時(shí)間。這種時(shí)間表示法在類Unix(Unix-like)操作系統(tǒng)上是一個(gè)標(biāo)準(zhǔn),并會(huì)影響以其C編程語(yǔ)言開發(fā)給其他大部份操作系統(tǒng)使用的軟件。在大部分的32位操作系統(tǒng)上,此“time_t”數(shù)據(jù)模式使用一個(gè)有符號(hào)32位整數(shù)(signed int32)存儲(chǔ)計(jì)算的秒數(shù)。依照此“time_t”標(biāo)準(zhǔn),在此格式能被表示的最后時(shí)間是第2147483647秒(代表格林尼治時(shí)間2038年1月19日凌晨03:14:07)。下一秒,即格林尼治時(shí)間2038年1月19日凌晨03:14:08,由于32位整型溢出,時(shí)間將會(huì)被“繞回”(wrap around)成一個(gè)負(fù)數(shù),變成了第 -2147483648 秒(代表格林尼治時(shí)間1901年12月13日20:45:52),造成應(yīng)用程序發(fā)生嚴(yán)重的時(shí)間錯(cuò)誤,而無(wú)法運(yùn)行。
引文
The latest time that can be represented in Unix’s signed 32-bit integer time format is 03:14:07 UTC on Tuesday, 19 January 2038 (2,147,483,647 seconds after 1 January 1970).[2] Times beyond that will wrap around and be stored internally as a negative number, which these systems will interpret as having occurred on 13 December 1901 rather than 19 January 2038. This is caused by integer overflow. The counter runs out of usable digit bits, flips the sign bit instead, and reports a maximally negative number (continuing to count up, toward zero). Resulting erroneous calculations on such systems are likely to cause problems for users and other relying parties.
Programs that work with future dates will begin to run into problems sooner; for example a program that works with dates 20 years in the future will have to be fixed no later than 2018.
上面說(shuō)到2038年問(wèn)題將會(huì)逐漸的解決直到2018年,但是就目前的時(shí)間來(lái)推算,似乎還存在著很大的問(wèn)題。
總結(jié)
滿心期待的寫下這篇博文,期待著有那么一天,我將能夠親手和這個(gè)可愛(ài)i的BUG交手,并且解決它。當(dāng)然,所有的前提都是需要在漫長(zhǎng)的歲月中等到2038年1月19日凌晨03:14:07。
聯(lián)系客服