「單比特錯誤」真的會造成整個程序乃至計算機系統的崩潰么?現代計算機有哪些檢錯、糾錯機制?
在劉宇昆的科幻小說《單比特錯誤》里說,由於外太空來的的一個高能粒子使車載導航系統的微機系統出現了一個比特的電平錯誤,以至於使整個導航系統崩潰,造成嚴重車禍——這在現代計算機系統中真的可能發生么(總覺得不科學)?現代計算機系統有哪些檢錯、糾錯機制?
如果沒有誤碼校驗或檢糾錯機制,單比特翻轉是完全有可能造成程序崩潰的。
舉個例子:在存在變長編碼的系統中,碼流中的單比特錯誤在解碼端可能導致連續的碼字解碼錯誤,導致錯誤大規模擴散,這種現象被稱為誤碼擴散。檢糾錯機制主要有兩大方面——
1.系統級或硬體級的抗誤碼,即硬體冗餘;2.抗誤碼編解碼機制,即編碼冗餘;1. 常見的系統級或者硬體級的抗誤碼機制,如@乙振斐 所說的,一般被稱為「三模冗餘(Triple Modular Redundancy-TMR)」——核心計算模塊由三個完全相同的模塊共同完成,三個模塊共用一個輸入源,各自的輸出經過逐比特「表決」後,得到的比特流的誤碼率會大大降低;只有超過兩個模塊的輸入比特流在同一比特位置均發生比特翻轉時,表決碼流才會出錯;三模冗餘可以將線性的誤碼概率降低至平方級的誤碼概率。
2. 糾錯編碼(Error Correcting Code-ECC),糾錯編碼的演算法過於龐雜,但是核心思想大多是通過引入「編碼冗餘」,增加編碼後碼字之間的漢明距離(Hamming Distance表徵某個編碼的抗誤碼性能),從而達到更強的抗誤碼性能;
此外,需要補充的一點是:只檢錯不糾錯的檢錯編碼演算法,依然具有抗誤碼能力。因為檢錯往往即可將誤碼擴散限制在系統允許的範圍內,從而避免程序崩潰。所謂「單比特錯誤」或曰「比特反轉」(bit flipping) 其實不算罕見,但導致系統崩潰的畢竟是極少數。因為日常用的大部分數據是諸如視頻、音樂、圖片這樣的媒體文件,可執行文件的比例相對小得多;就算髮生比特反轉,按照概率也更容易發生在總量大的媒體文件上。
在數據的存儲和傳輸過程中由於各種各樣的原因都有可能導致比特反轉,所以要通過一些技術手段降低這種風險。比如在網路傳輸過程中常用 CRC [1] 校驗的辦法來發現錯誤。在單個計算機內部,出現比特錯誤的主要部件是內存和磁碟。因此多數伺服器上使用的是帶 ECC [2] 糾錯機制的內存條 [3]【價錢比普通內存條貴不少】。磁碟在存儲數據時也需要附帶存儲一些冗餘信息用於糾錯。此外在文件系統層面也可以通過一些手段修正錯誤,比如 ZFS [4] 採用了哈希樹的方式來避免磁碟自身的糾錯機制無法發現的漏網之魚。
另外,如果你下載過一些 Linux 發行鏡像,會發現通常會附帶一個 MD5 或者 SHA1 的哈希碼,主要是用於驗證文件是否被惡意篡改過,但也可以用來檢驗下載和存儲過程中是否因為硬體問題導致了比特反轉。
最後,據我所知在航空航天這樣的對可靠性要求非常高的場合中會使用特殊的硬體來避免高強度宇宙射線導致的比特反轉,並且核心系統都是有好幾套完全相同的副本同時運行輸出結果進行比較後才能採用的,因此發生災難性錯誤導致飛機、飛船墜毀的概率幾乎可以忽略不計。
[1]: http://en.wikipedia.org/wiki/Cyclic_redundancy_check[2]: http://en.wikipedia.org/wiki/Error-correcting_code[3]: http://en.wikipedia.org/wiki/ECC_memory[4]: http://en.wikipedia.org/wiki/ZFS
[5]: http://en.wikipedia.org/wiki/Hash_tree記得在《支撐處理器的技術——永無止境地追求速度的世界》書里寫到由於宇宙射線等中子撞擊導致產生雜訊處理器約每一百萬小時出現一次錯誤,在萬米高空這個頻率大大增加,然後通過ECC等可以規避。
具體自己看書吧。事實上,在一切信號處理電路中,包括CPU、內存、乙太網、硬碟、鍵盤、滑鼠、觸摸板,,,,每分每秒都出現大量的單比特錯誤,根本不需要外太空的什麼粒子來摻和。但如你所見,他們運行的好好的。
實際工況下,系統不被看成符號,而是信號與噪音的混合。
錯誤是肯定會以一定幾率出現的,好的設計可以減少這樣的幾率。
在數字化信息傳播的過程中,信道編碼時會對原始信息進行處理,處理後的信息在接受一定範圍錯誤比特的情況下依然能計算校驗出正確的信息,這樣的處理叫做糾錯編碼。在現代通信領域,糾錯編碼已經發展為一門學科,研究各種糾錯編碼演算法的性能和效率。這門學科的大佬級人物還是個中國人的名字:林舒,有出版聖經級專著:《差錯控制編碼(ECC)》,國內這方面的研究領域裡有西安電子科技大學的王新梅教授,王育民教授。
俺當年在實驗室就是天天用matlab模擬計算各種低密度奇偶校驗碼的碼字的誤碼率曲線。好一點的信噪比下有時候一種糾錯編碼的模擬誤碼率跑個幾天才出現個位數字的錯誤比特。見過因單比特出錯而導致進程掛掉,且磁碟上的程序映像被改寫的實例。萬般無奈之下用mv命令把那個inode移到別處就好了。
「程心的生態球」真的會造成整個人類乃至整個宇宙系統的崩潰么?現代宇宙學有哪些檢錯、糾錯機制?
推薦閱讀:
※如何評價電影《星球大戰8》(Star Wars: Episode VIII)?
※玩遊戲里你遇到過哪些神奇的坦克?
※doctor who中如果將所有博士視為一個人那麼誰是博士的真愛(只考慮愛情所以t和m不算)?
※當時間領主是怎樣的體驗?
※《神秘博士》與《星際迷航》在本質上有什麼區別?