Hamming Code ECC (漢明碼錯誤檢測與修正)


    現(xiàn)在存儲工程師要接觸到RAID 系統(tǒng)中最為復(fù)雜的等級之一。RAID 2 之所以復(fù)雜就是因為它采用了早期的錯誤檢測與修正技術(shù)—-漢明碼(Hamming Code )校驗技術(shù)。因此在介紹RAID 2 之前有必要講講漢明碼的原理。


    漢明碼的原理:



圖 1-5 針對4 位數(shù)據(jù)的漢明碼編碼示意圖


    漢明碼是一個在原有數(shù)據(jù)中插入若干校驗碼來進行錯誤檢查和糾正的編碼技術(shù)。以典型的4 位數(shù)據(jù)編碼為例,漢明碼將加入3 個校驗碼,從而使實際傳輸?shù)臄?shù)據(jù)位達到7 個(位),它們的位置如果把上圖中的位置橫過來就是:



圖 1-6 漢明碼原理


    注:Dx中的x是2的整數(shù)冪(下面的冪都是指整數(shù)冪)結(jié)果,多少冪取決于碼位,D1是0次冪,D8是3次冪,想想二進制編碼就知道了


    現(xiàn)以數(shù)據(jù)碼1101 為例講講漢明碼的編碼原理,此時D8=1、D4=1、D2=0、D1=1,在P1 編碼時,先將D8、D4、D1 的二進制碼相加,結(jié)果為奇數(shù)3,漢明碼對奇數(shù)結(jié)果編碼為1,偶數(shù)結(jié)果為0,因此P1 值為1,D8+D2+D1=2 ,為偶數(shù),那么P2 值為0,D4+D2+D1=2 ,為偶數(shù),P3 值為0。這樣,參照上文的位置表,漢明碼處理的結(jié)果就是1010101 。在這個4 位數(shù)據(jù)碼的例子中,存儲工程師可以發(fā)現(xiàn)每個漢明碼都是以三個數(shù)據(jù)碼為基準進行編碼的。圖示就是它們的對應(yīng)表(圖1-6 ):



    從編碼形式上,存儲工程師可以發(fā)現(xiàn)漢明碼是一個校驗很嚴謹?shù)木幋a方式。在這個例子中,通過對4 個數(shù)據(jù)位的3 個位的3 次組合檢測來達到具體碼位的校驗與修正目的(不過只允許一個位出錯,兩個出錯就無法檢查出來了,這從下面的糾錯例子中就能體現(xiàn)出來)。在校驗時則把每個漢明碼與各自對應(yīng)的數(shù)據(jù)位值相加,如果結(jié)果為偶數(shù)(糾錯代碼為0)就是正確,如果為奇數(shù)(糾錯代碼為1)則說明當(dāng)前漢明碼所對應(yīng)的三個數(shù)據(jù)位中有錯誤,此時再通過其他兩個漢明碼各自的運算來確定具體是哪個位出了問題。


    還是剛才的1101 的例子,正確的編碼應(yīng)該是1010101 ,如果第三個數(shù)據(jù)位在傳輸途中因干擾而變成了1,就成了1010111 。檢測時,P1+D8+D4+D1 的結(jié)果是偶數(shù)4,第一位糾錯代碼為0,正確。P1+D8+D2+D1 的結(jié)果是奇數(shù)3,第二位糾錯代碼為1,有錯誤。P3+D4+D2+D1 的結(jié)果是奇數(shù)3,第三但糾錯代碼代碼為1,有錯誤。那么具體是哪個位有錯誤呢?三個糾錯代碼從高到低排列為二進制編碼110 ,換算成十進制就是6,也就是說第6 位數(shù)據(jù)錯了,而數(shù)據(jù)第三位在漢明碼編碼后的位置正好是第6 位。


    那么漢明碼的數(shù)量與數(shù)據(jù)位的數(shù)量之間有何比例呢?上面的例子中數(shù)據(jù)位是4 位,加上3 位漢明碼是7 位,而2 的3 次冪是8。這其中就存在一個規(guī)律,即2P≥P+D+1 ,其中P 代表漢明碼的個數(shù),D 代表數(shù)據(jù)位的個數(shù),比如4 位數(shù)據(jù),加上1 就是5,而能大于5 的2 的冪數(shù)就是3 (23=8,22=4)。這樣,存儲工程師就能算出任何數(shù)據(jù)位時所需要的漢明碼位數(shù):7 位數(shù)據(jù)時需要4 位漢明碼(24>4+7+1),64 位數(shù)據(jù)時就需要7 位漢明碼(27>64+7+1 ),大家可以依此推算。此時,它們的編碼規(guī)也與4 位時不一樣了。


    另外,漢明碼加插的位置也是有規(guī)律的。以四位數(shù)據(jù)為例,第一個是漢明碼是第一位,第二個是第二位,第三個是第四位,1、2、4 都是2 的整數(shù)冪結(jié)果,而這個冪次數(shù)是從0 開始的整數(shù)。這樣存儲工程師可以推斷出來,漢明碼的插入位置為1(20)、2(21)、4(22)、8(23)、16(24)、32(25)……
說完漢明碼,下面就開始介紹RAID 2 等級。



圖 1-7 RAID-2 結(jié)構(gòu)圖解


    RAID 2 等級介紹:


    由于漢明碼是位為基礎(chǔ)進行校驗的,那么在RAID2 中,一個硬盤在一個時間只存取一位的信息。沒錯,就是這么恐怖。如圖中所示,左邊的為數(shù)據(jù)陣列,陣列中的每個硬盤一次只存儲一個位的數(shù)據(jù)。同理,右邊的陣列(存儲工程師稱之為校驗陣列)則是存儲相應(yīng)的漢明碼,也是一位一個硬盤。所以RAID 2 中的硬盤數(shù)量取決于所設(shè)定的數(shù)據(jù)存儲寬度。如果是4 位的數(shù)據(jù)寬度(這由用戶決定),那么就需要4 個數(shù)據(jù)硬盤和3 個漢明碼校驗硬盤,如果是64 位的位寬呢?從上文介紹的計算方法中,就可以算出來,數(shù)據(jù)陣列需要64 塊硬盤,校驗陣列需要7 塊硬盤。


    在寫入時,RAID 2 在寫入數(shù)據(jù)位同時還要計算出它們的漢明碼并寫入校驗陣列,讀取時也要對數(shù)據(jù)即時地進行校驗,最后再發(fā)向系統(tǒng)。通過上文的介紹,存儲工程師知道漢明碼只能糾正一個位的錯誤,所以RAID 2 也只能允許一個硬盤出問題,如果兩個或以上的硬盤出問題,RAID 2 的數(shù)據(jù)就將受到破壞。但由于數(shù)據(jù)是以位為單位并行傳輸,所以傳輸率也相當(dāng)快。


    RAID 2 是早期為了能進行即時的數(shù)據(jù)校驗而研制的一種技術(shù)(這在當(dāng)時的RAID 0、1 等級中是無法做到的),從它的設(shè)計上看也是主要為了即時校驗以保證數(shù)據(jù)安全,針對了當(dāng)時對數(shù)據(jù)即時安全性非常敏感的領(lǐng)域,如服務(wù)器、金融服務(wù)等。但由于花費太大(其實,從上面的分析中可以看出如果數(shù)據(jù)位寬越大,用于校驗陣列的相對投資就會越小,就如上面的4:3 與64:7), 成本昂貴,目前已基本不再使用,轉(zhuǎn)而以更高級的即時檢驗RAID 所代替,如RAID 3、5 等。



圖 1-8 RAID 2 特點


    本文版權(quán)歸作者及存儲在線所有,如需轉(zhuǎn)載,請與本站聯(lián)系。

分享到

多易

相關(guān)推薦