(57)【要約】【課題】冗長符号データ列を生成する際に高速で拡大ガロア体演算を実行できる冗長符号生成方法を提供する。【解決手段】冗長符号生成方法は、元データを複数のデータ列に分割することと、各データ列をそれぞれビット列に分割することと、各ビット列をメモリの異なる記憶領域に格納することと、所定の複数のビット数をデータ単位として、メモリに格納されている各ビット列から取り出されるデータ単位分のビットをベクトルとし、拡大ガロア体の原始多項式に対応する同伴行列を含み冗長符号データ列の生成に用いられる演算式に応じ、複数のベクトルの間で排他的論理和演算を実行することにより、ベクトル内でのビットシフトを行うことなく冗長符号データ列を構成するビット列を算出することと、を有する。【選択図】図２
2010239404.tif 000002
【特許請求の範囲】
【請求項１】
元データから拡大ガロア体演算により冗長符号データ列を生成する冗長符号生成方法であって、
前記元データを複数のデータ列に分割することと、
前記各データ列を、前記拡大ガロア体演算に応じた本数のビット列に分割することと、
分割により生成したそれぞれのビット列をメモリの異なる記憶領域に格納することと、
所定の複数のビット数をデータ単位として、前記メモリに格納されている各ビット列から取り出される前記データ単位分のビットをベクトルとし、前記拡大ガロア体の原始多項式に対応する同伴行列を含み前記冗長符号データ列の生成に用いられる演算式に応じ、複数の前記ベクトルの間で排他的論理和演算を実行することにより、前記ベクトル内でのビットシフトを行うことなく前記冗長符号データ列を構成するビット列を算出することと、
を有する冗長符号生成方法。
【請求項２】
前記排他的論理和演算をＣＰＵにより実行し、前記データ単位は前記ＣＰＵでの演算のビット幅に一致させる、請求項１に記載の冗長符号生成方法。
【請求項３】
前記排他的論理和演算を排他的論理和演算器により実行する、請求項１に記載の冗長符号生成方法。
【請求項４】
元データから拡大ガロア体演算により冗長符号データ列を生成する冗長符号生成装置であって、
少なくとも排他的論理和演算器を有する演算手段と、
メモリと、
前記演算手段と前記メモリとを接続するアドレスバス及びデータバスと、
を有し、
前記元データは複数のデータ列に分割され、前記各データ列は、前記拡大ガロア体演算に応じた本数のビット列に分割されて、前記メモリは、分割により生成されたそれぞれのビット列を格納する複数の記憶領域を有し、
前記演算手段は、所定の複数のビット数をデータ単位として、前記拡大ガロア体の原始多項式に対応する同伴行列を含み前記冗長符号データ列の生成に用いられる演算式に応じたアドレス制御により前記メモリに格納されている各ビット列から前記データ単位分のビットをベクトルとして取り出し、複数の前記ベクトルの間で排他的論理和演算を実行することにより、前記ベクトル内でのビットシフトを行うことなく、前記冗長符号データ列を構成するビット列を算出し、算出されたビット列を前記メモリにおける対応する記憶領域に格納する、冗長符号生成装置。
【請求項５】
前記排他的論理和演算器と前記アドレスバスに対して前記アドレス制御を実行するアドレス制御ユニットとを有するＣＰＵによって前記演算手段が構成されている、請求項４に記載の冗長符号生成装置。
【請求項６】
前記データ単位は前記ＣＰＵでの演算のビット幅に一致している、請求項５に記載の冗長符号生成装置。
【請求項７】
元データが複数のデータ列に分割されかつ前記元データから拡大ガロア体演算により冗長符号データ列が生成されている場合に、正常なデータ列と前記冗長符号データ列とから、前記データ列のうちの誤りとなったデータ列を復元して復元データ列を生成するデータ復元方法であって、
前記正常なデータ列と前記冗長符号データ列の各々を前記拡大ガロア体演算に応じた本数のビット列に分割することと、
分割により生成したそれぞれのビット列をメモリの異なる記憶領域に格納することと、
所定の複数のビット数をデータ単位として、前記メモリに格納されている各ビット列から取り出される前記データ単位分のビットをベクトルとし、
前記拡大ガロア体の原始多項式に対応する同伴行列を含みデータ列の復元に用いられる演算式に応じ、複数の前記ベクトルの間で排他的論理和演算を実行することにより、前記ベクトル内でのビットシフトを行うことなく前記復元データ列を構成するビット列を算出することと、
を有するデータ復元方法。
【請求項８】
前記排他的論理和演算をＣＰＵにより実行し、前記データ単位は前記ＣＰＵでの演算のビット幅に一致させる、請求項７に記載のデータ復元方法。
【請求項９】
前記排他的論理和演算を排他的論理和演算器により実行する、請求項７に記載のデータ復元方法。
【請求項１０】
元データが複数のデータ列に分割されかつ前記元データから拡大ガロア体演算により冗長符号データ列が生成されている場合に、正常なデータ列と前記冗長符号データ列とから、前記データ列のうちの誤りとなったデータ列を復元して復元データ列を生成するデータ復元装置であって、
少なくとも排他的論理和演算器を有する演算手段と、
メモリと、
前記演算手段とメモリとを接続するアドレスバス及びデータバスと、
を有し、
前記正常なデータ列と前記冗長符号データ列の各々が前記拡大ガロア体演算に応じた本数のビット列に分割され、前記メモリは、分割により生成されたそれぞれのビット列を格納する複数の記憶領域を有し、
前記演算手段は、所定の複数のビット数をデータ単位として、前記拡大ガロア体の原始多項式に対応する同伴行列を含みデータ列の復元に用いられる演算式に応じたアドレス制御により前記メモリに格納されている各ビット列から前記データ単位分のビットをベクトルとして取り出し、複数の前記ベクトルの間で排他的論理和演算を実行することにより、前記ベクトル内でのビットシフトを行うことなく、前記復元データ列を構成するビット列を算出し、算出されたビット列を前記メモリにおける対応する記憶領域に格納する、データ復元装置。
【請求項１１】
前記排他的論理和演算器と前記アドレスバスに対して前記アドレス制御を実行するアドレス制御ユニットとを有するＣＰＵによって前記演算手段が構成されている、請求項１０に記載のデータ復元装置。
【請求項１２】
前記データ単位は前記ＣＰＵでの演算のビット幅に一致している、請求項１１に記載のデータ復元装置。
【請求項１３】
複数のデータ記録媒体と、
排他的論理和演算器と、
を有し、
元データが複数のデータ列に分割されて前記データ記録媒体に分散格納されるとともに、前記元データから拡大ガロア体演算により求められた冗長符号データ列が少なくとも１つのデータ記録媒体に格納され、
前記各データ列は、前記拡大ガロア体演算に応じた本数のビット列に分割され、
前記排他的論理和演算器は、所定の複数のビット数をデータ単位として、冗長符号データ列の生成のための演算式またはデータ列復元のための演算式であって前記拡大ガロア体の原始多項式に対応する同伴行列を含む演算式に応じ、各ビット列から前記データ単位分のビットをベクトルとして取り出して複数の前記ベクトルの間で排他的論理和演算を実行することにより、前記ベクトル内でのビットシフトを行うことなく前記拡大ガロア体演算を行う、ＲＡＩＤ記憶装置。
【請求項１４】
前記排他的論理和演算器を備えるＣＰＵを有し、前記データ単位は前記ＣＰＵでの演算のビット幅に一致する、請求項１３に記載のＲＡＩＤ記憶装置。
【請求項１５】
ＣＰＵをさらに備え、前記排他的論理和演算器は前記ＣＰＵの外部に設けられる、請求項１３に記載のＲＡＩＤ記憶装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データに基づいて冗長符号を生成する方法及び装置と、冗長符号を用いて元のデータを復元する方法及び装置と、冗長符号を用いたＲＡＩＤ（Redundant Array of Inexpensive DisksあるいはRedundant Array of Independent Disks）記憶装置とに関する。
【背景技術】
【０００２】
データにおいて発生し得る種々の誤り（エラー）を検出しその誤りを訂正する技術の一つとして、データに基づいて冗長符号を生成し、データにその冗長符号を付加する技術がある。冗長符号を用いて耐障害性を向上させる場合には、データにおいて誤りが生じていないときにはそのデータをそのまま使用し、データにおいて例えばブロック消失などの誤りが生じたときには冗長符号を用いて元のデータを復元するようにする。このような冗長符号は、例えば、ＲＡＩＤシステムにおいて用いられている。
【０００３】
ＲＡＩＤシステムは、複数のディスク装置を接続してディスクアレイとして構成した記憶装置であり、読み書きの高速化及び信頼性の向上のために、冗長性を持たせつつ複数台のディスク装置にデータを冗長かつ分散させて記録する。ＲＡＩＤシステムでは、ディスク装置の故障に対する耐障害性も向上しており、例えばディスク装置の１台に故障が生じたとしても、データを正しく読み取ることができる。ＲＡＩＤシステムは、その冗長構成によっていくつかのものに分類されるが、そのうちＲＡＩＤ６システムでは、非特許文献１，２などに示されるように、データをブロックに分割してディスク装置に分散配置する際に、ブロックからリード・ソロモン(Reed-Solomon)符号を計算し、ブロックに分割されたデータとともにそのリード・ソロモン符号をディスク装置に格納するようにしている。リード・ソロモン符号はガロア体（有限体）上での演算を利用した冗長符号である。詳しく言えば、ＲＡＩＤ６システムは、最低６台のディスク装置を使用するものであって、それぞれＰ，Ｑと呼ばれる２種類のパリティ符号（冗長符号）を生成し、Ｐ符号データ列を１台のディスク装置に、Ｑ符号データ列を別の１台のディスク装置に、残りのディスクにはデータを分散格納することによって、全体で２台のディスク装置の故障までに対応できるようにしたものである。
【０００４】
ガロア体演算を利用した冗長符号は、その冗長性が優れていることが知られている。しかしながら、ガロア体演算は、汎用のマイクロプロセッサあるいはＣＰＵ（中央処理ユニット；Central Processing Unit）にとっては、処理負荷が大きく、多大な計算時間を要するものである。図１は、本発明の関連技術における、リード・ソロモン符号である冗長符号を計算する処理を説明する図であり、２4拡大ガロア体（ＧＦ(２4)）を使用した冗長符号列ｐ，ｑをビット列から生成する処理を示している。ここでは、冗長符号列生成の対象となるデータが４つのビット列ａ，ｂ，ｃ，ｄに分割されている。ビット列ａはビットａ00，ａ01，ａ02，ａ03，…からなり、ビット列ｂはビットｂ00，ｂ01，ｂ02，ｂ03，…からなる。ビット列ｃ，ｄも同様である。また冗長符号列ｐ，ｑもそれぞれビット列であり、冗長符号列ｐはビットＰ00，Ｐ01，Ｐ02，Ｐ03，…からなり、冗長符号列ＱはビットＱ00，Ｑ01，Ｑ02，Ｑ03，…からなる。
【０００５】
ここではＧＦ(２4)を使用することにより、冗長符号列の計算は、ビット列から４ビットずつ取り出して行われ、冗長符号列Ｐ，Ｑも図１に示した１回の計算によって４ビットずつ生成される。図１においてＩは４×４の単位行列であり、Ｔは、ＧＦ(２4)の原始多項式（ｘ4＋ｘ＋１＝０）の同伴行列であって、式(1)に示される４×４の行列である。図面及び本明細書において、明示的な加算記号（"＋"）は、通常の加算ではなく、排他的論理和（ＸＯＲ；eXclusive OR）を示している。
【０００６】
【数１】
2010239404.tif 000003
【０００７】
例えばＱ00は、
Ｑ00＝ａ00＋ｂ03＋ｃ00＋ｃ03＋ｄ02      (2)
によって計算される。排他的論理和演算であるので、５つのビットａ00，ｂ03，ｃ00，ｃ03，ｄ02のうち、"１"であるものが奇数個であれば、Ｑ00は"１"となり、そうでなければＱ00は"０"となる。
【０００８】
このように通常のガロア体演算は、ビット単位に行われる。冗長符号列を用いて元のデータを復元する場合にもガロア体演算を実行する。
【０００９】
ところで一般にＣＰＵあるいはマイクロプロセッサは、８ビット（すなわち１バイト）、１６ビット、３２ビットなどを１ワードとして、ワード単位で演算処理を実行する。そして、排他的論理和演算についてもワード単位で実行し、その際、計算対象のワード間で、対応するビット同士の排他的論理和を演算する。すなわち、ワードＡ，Ｂについての排他的論理和の演算結果Ｃも１ワードのデータであって、ワードＡの１ビット目とワードＢの１ビット目の排他的論理和がワードＣの１ビット目に格納され、ワードＡの２ビット目とワードＢの２ビット目の排他的論理和がワードＣの２ビット目に格納される、というようになっている。
【００１０】
このようなＣＰＵを用いて上述したガロア体演算を実行する場合、ビット列ａ〜ｄはいずれもワードデータとして扱うことができるが、例えば冗長符号列Ｑの算出に際しては、式(2)に示されるように、ビット列ａの１ビット目であるビットａ00とビット列ｂの４ビット目であるビットｂ03との排他的論理和の計算が必要となる。すなわち、データにおけるビットシフトを行う必要がある。さらに、ワード単位での排他的論理和の演算において、その時点での演算に無関係なビットによって演算結果が影響されることを防ぐために、ビット単位でのデータのマスク動作も行う必要がある。このようなビットシフトやデータマスクの実行回数は多数回に及ぶ。しかしながら汎用のＣＰＵでは、そのアーキテクチャ上、ビットシフト命令やデータマスク命令などを効率的に実行することができず、そのため、これらの処理はＣＰＵにとって処理負荷の高いものとなっている。
【００１１】
汎用のＣＰＵを組み込んだ装置において、そのＣＰＵによってよってガロア体演算を行わせた場合には、装置の処理性能に影響が及ぼされる可能性がある。そのため、本発明の関連技術においては、冗長符号列生成のためのガロア体演算を高速に行うためには、その演算に専用のなんらかのハードウェアが必要であるとされている。例えば特許文献１には、リード・ソロモン復号に必要なガロア体乗算回路を多数の構成要素からなるハードウェア回路で構成した例が示されている。
【００１２】
ＲＡＩＤシステムにおいて各ディスク装置に格納されるデータを生成するために、汎用のＣＰＵを使用し、ビットシフト演算、データマスク演算、論理積演算及び排他的論理和演算によってガロア体の積演算を行う例が、特許文献２に記載されている。また特許文献３には、特許文献２の手法により冗長符号が付加されたデータから元のデータを復元するために、ガロア体の積演算テーブルを参照することが記載されている。
【先行技術文献】
【特許文献】
【００１３】
【特許文献１】特開２００７−１２９６１８号公報
【特許文献２】特開２００８−１７６６２１号公報
【特許文献３】特開２００８−１８６４００号公報
【非特許文献】
【００１４】
【非特許文献１】James S. Plank, "A Tutorial on Reed-Solomon Coding for Fault-Tolerance in RAID-like Systems," Technical Report UT-CS-96-332, University of Tennessee, July 1996
【非特許文献２】James S. Plank and Ying Ding, "Note: Correction to the 1997 Tutorial on Reed-Solomon Coding," Technical Report UT-CS-03-504, University of Tennessee, April 2003
【発明の概要】
【発明が解決しようとする課題】
【００１５】
特許文献２，３に示されるように汎用のマイクロプロセッサあるいはＣＰＵを用いてガロア体演算を行わせる例は存在するものの、高速でガロア体演算を行わせる場合には、ビットシフトに相当する処理を高速に実行できる専用のハードウェアを用いる必要がある。しかしながら、ガロア体演算を高速に行わせるための専用ハードウェアは高価であるため、特殊なハードウェアを使用せず、汎用のＣＰＵなどのみを用いて、ガロア体演算を高速に実行できる手法が求められている。
【００１６】
本発明の目的は、特殊なハードウェアを用いることなく、高速でガロア体演算を行うことができて冗長符号を生成する方法及び装置を提供することにある。
【００１７】
本発明の別の目的は、特殊なハードウェアを用いることなく、冗長符号に基づき、高速でガロア体演算を行うことができて元のデータを復元する方法及び装置を提供することにある。
【００１８】
本発明のさらに別の目的は、特殊なハードウェアを用いることなく、冗長符号の生成とデータの復元のために高速でガロア体演算を行うことができて性能が向上したＲＡＩＤ記憶装置を提供することにある。
【課題を解決するための手段】
【００１９】
本発明の冗長符号生成方法は、元データから拡大ガロア体演算により冗長符号データ列を生成する冗長符号生成方法であって、元データを複数のデータ列に分割することと、各データ列を、拡大ガロア体演算に応じた本数のビット列に分割することと、分割により生成したそれぞれのビット列をメモリの異なる記憶領域に格納することと、所定の複数のビット数をデータ単位として、メモリに格納されている各ビット列から取り出されるデータ単位分のビットをベクトルとし、拡大ガロア体の原始多項式に対応する同伴行列を含み冗長符号データ列の生成に用いられる演算式に応じ、複数のベクトルの間で排他的論理和演算を実行することにより、ベクトル内でのビットシフトを行うことなく冗長符号データ列を構成するビット列を算出することと、を有する。
【００２０】
本発明の冗長符号生成装置は、元データから拡大ガロア体演算により冗長符号データ列を生成する冗長符号生成装置であって、少なくとも排他的論理和演算器を有する演算手段と、メモリと、演算手段とメモリとを接続するアドレスバス及びデータバスと、を有し、元データは複数のデータ列に分割され、各データ列は、拡大ガロア体演算に応じた本数のビット列に分割されて、メモリは、分割により生成されたそれぞれのビット列を格納する複数の記憶領域を有し、演算手段は、所定の複数のビット数をデータ単位として、拡大ガロア体の原始多項式に対応する同伴行列を含み冗長符号データ列の生成に用いられる演算式に応じたアドレス制御によりメモリに格納されている各ビット列からデータ単位分のビットをベクトルとして取り出し、複数のベクトルの間で排他的論理和演算を実行することにより、ベクトル内でのビットシフトを行うことなく、冗長符号データ列を構成するビット列を算出し、算出されたビット列をメモリにおける対応する記憶領域に格納する。
【００２１】
本発明のデータ復元方法は、元データが複数のデータ列に分割されかつ元データから拡大ガロア体演算により冗長符号データ列が生成されている場合に、正常なデータ列と冗長符号データ列とから、データ列のうちの誤りとなったデータ列を復元して復元データ列を生成するデータ復元方法であって、正常なデータ列と冗長符号データ列の各々を拡大ガロア体演算に応じた本数のビット列に分割することと、分割により生成したそれぞれのビット列をメモリの異なる記憶領域に格納することと、所定の複数のビット数をデータ単位として、メモリに格納されている各ビット列から取り出されるデータ単位分のビットをベクトルとし、拡大ガロア体の原始多項式に対応する同伴行列を含みデータ列の復元に用いられる演算式に応じ、複数のベクトルの間で排他的論理和演算を実行することにより、ベクトル内でのビットシフトを行うことなく復元データ列を構成するビット列を算出することと、を有する。
【００２２】
本発明のデータ復元装置は、元データが複数のデータ列に分割されかつ元データから拡大ガロア体演算により冗長符号データ列が生成されている場合に、正常なデータ列と冗長符号データ列とから、データ列のうちの誤りとなったデータ列を復元して復元データ列を生成するデータ復元装置であって、少なくとも排他的論理和演算器を有する演算手段と、メモリと、演算手段とメモリとを接続するアドレスバス及びデータバスと、を有し、正常なデータ列と冗長符号データ列の各々が拡大ガロア体演算に応じた本数のビット列に分割され、メモリは、分割により生成されたそれぞれのビット列を格納する複数の記憶領域を有し、演算手段は、所定の複数のビット数をデータ単位として、拡大ガロア体の原始多項式に対応する同伴行列を含みデータ列の復元に用いられる演算式に応じたアドレス制御によりメモリに格納されている各ビット列からデータ単位分のビットをベクトルとして取り出し、複数のベクトルの間で排他的論理和演算を実行することにより、ベクトル内でのビットシフトを行うことなく、復元データ列を構成するビット列を算出し、算出されたビット列をメモリにおける対応する記憶領域に格納する。
【００２３】
本発明のＲＡＩＤ記憶装置は、複数のデータ記録媒体と、排他的論理和演算器と、を有し、元データが複数のデータ列に分割されてデータ記録媒体に分散格納されるとともに、元データから拡大ガロア体演算により求められた冗長符号データ列が少なくとも１つのデータ記録媒体に格納され、各データ列は、拡大ガロア体演算に応じた本数のビット列に分割され、排他的論理和演算器は、所定の複数のビット数をデータ単位として、冗長符号データ列の生成のための演算式またはデータ列復元のための演算式であって拡大ガロア体の原始多項式に対応する同伴行列を含む演算式に応じ、各ビット列からデータ単位分のビットをベクトルとして取り出して複数のベクトルの間で排他的論理和演算を実行することにより、ベクトル内でのビットシフトを行うことなく拡大ガロア体演算を行う。
【発明の効果】
【００２４】
本発明では、ビット単位ではなく、複数のビットによって構成されるデータ単位での排他的論理和演算を実行することにより、ビットシフトやデータマスクの演算などを行うことなくガロア体演算を実行することが可能になる。そのため、例えば汎用のＣＰＵを用いて演算を実行する場合であっても、ビットシフト命令やデータマスク命令を用いる必要がなくなるので、高速でガロア体演算を行うことが可能になる。
【図面の簡単な説明】
【００２５】
【図１】関連技術における２4拡大ガロア体（ＧＦ(２4)）を使用した冗長符号列生成の演算処理を説明する図である。
【図２】本発明の実施の一形態における冗長符号列生成の演算処理を説明する図である。
【図３】図２に示す演算処理の原理を図解する図である。
【図４】図２に示す冗長符号の生成と関連技術における冗長符号の生成とを対比して示す図である。
【図５】図２に示す冗長符号データ列生成の演算処理を実行するための基本的なハードウェア構成の一例を示すブロック図である。
【図６】実施の一形態におけるＲＡＩＤシステムの構成例を示すブロック図である。
【図７】図６に示したＲＡＩＤ装置の動作を説明する図である。
【図８】故障したディスク装置のデータの復旧のために用いられるガロア体乗算表の一例を示す図である。
【図９】本発明の実施の一形態におけるデータ復元のための演算処理の例を説明する図である。
【図１０】ＲＡＩＤシステムの別の構成例を示すブロック図である。
【図１１】ＲＡＩＤシステムのさらに別の構成例を示すブロック図である。
【発明を実施するための形態】
【００２６】
次に、本発明の実施の形態について説明する。最初に、本発明の実施の一形態における冗長符号の生成について、図２を用いて説明する。以下では、４台のデータ格納用のディクス装置と１台のＰ符号列格納用のディスク装置と１台のＱ符号列格納用のディスク装置とを有するＲＡＩＤ６システムへの適用を念頭において、ガロア体ＧＦ(２4)上の演算により、データから冗長符号データ列Ｐ，Ｑを生成する場合について説明する。ここでは冗長符号データ列生成の対象となるデータは、それぞれデータ格納用のディスク装置に対応する４つのデータ列ａ，ｂ，ｃ，ｄに分けられている。データ格納用のディクス装置の数が４台より多い場合には、それに応じて、データ列への分割数も増加させればよい。
【００２７】
さらに本実施形態では、ガロア体ＧＦ(２4)演算を行うことに対応して、各データ列ａ〜ｄは、いずれもさらに４つのビット列に分けられている。具体的にはデータ列ａは、ビット列ａ0，ａ1，ａ2，ａ3に分けられ、データ列ｂは、ビット列ｂ0，ｂ1，ｂ2，ｂ3に分けられている。データ列ｃ，ｄについても同様である。ビット列ａ0は、ビットａ00，ａ01，ａ02，ａ03，ａ04，…からなり、ビット列ａ1は、ビットａ10，ａ11，ａ12，ａ13，ａ14，…からなる。他のビット列についても同様である。ここでは、冗長符号データ列の生成に用いられるガロア体はＧＦ(２4)としているが、冗長符号データ列の生成に用いられるガロア体はこれに限定されるものではなく、例えば、ＧＦ(２16)やＧＦ(２8)などを使用することもできる。データ列を何個のビット列に分割するかは、ガロア体演算で使用するガロア体の大きさに依存するので、例えばＧＦ(２8)上でのガロア体演算を実行する場合には、１つのデータ列を８個のビット列に分割するようにする。
【００２８】
本実施形態では、ＣＰＵなどを用いた排他的論理和演算に適したビット幅のことをデータ単位と呼ぶ。データ単位は複数のビットからなり、例えば、ＣＰＵ内での演算器のデータ処理の単位となるビット数に応じて設定される。現行のＣＰＵでは、３２ビットあるいは６４ビット単位でデータを取り扱うものが多いが、３２ビットあるいは６４ビットのＣＰＵであっても、８ビット（すなわち１バイト）単位あるいは１６ビット単位を１ワードとしてデータ処理を行えるように構成されているので、データ単位のビット数は、例えば、８，１６，３２または６４である。さらにデータ単位のビット数を多くすることも可能である。
【００２９】
生成されるべき冗長符号データ列Ｐも同様に４つのビット列Ｐ0，Ｐ1，Ｐ2，Ｐ3からなり、冗長符号データ列Ｑは４つのビット列Ｑ0，Ｑ1，Ｑ2，Ｑ3からなる。ビット列Ｐ0は、ビットＰ00，Ｐ01，Ｐ02，Ｐ03，Ｐ04，…からなり、ビット列Ｑ1は、ビットＱ10，Ｑ11，Ｑ12，Ｑ13，Ｑ14，…からなる。
【００３０】
本実施形態では、元のデータ側のビット列のそれぞれからデータ単位分のビットを取り出してガロア体演算を行うことにより、冗長符号データ側の各ビット列におけるデータ単位分の個数のビットの値を決定する。そのため、各ビット列ａ0，ａ1，…，ｂ0，…，ｄ3，Ｐ0，Ｐ1，…，Ｑ3がいずれもデータ単位分の要素を有する横ベクトルであると考えることができる。これらの横ベクトルの各要素は１ビットの値であり、"０"また"１"で表される。
【００３１】
本実施形態では、このように各ビット列に対応するベクトルを考えることによって、図２に示すような行列演算を行うことによってガロア体演算を実行し、冗長符号データ列Ｐ，Ｑをデータ単位ごとに決定する。例えば、ベクトルとして表されるビット列Ｑ0は、いずれもベクトルとして表されるビット列ａ0，ｂ3，ｃ0，ｃ3，ｄ2の排他的論理和演算（"＋"）により、
Ｑ0＝ａ0＋ｂ3＋ｃ0＋ｃ3＋ｄ2      (3)
のように表される。ベクトル相互の排他的論理和演算とは、ベクトルの要素ごとに、ベクトル間での対応する要素同士での排他的論理和演算を実行することを意味する。ビット列における未処理のビットがなくなるまで、各ビット列からデータ単位分のビットを取り出して上述した排他的論理和演算を実行することを繰り返すことにより、元のデータ全体に対応した冗長符号データ列Ｐ，Ｑを得ることができる。図３は、ビット列をビットに展開して本実施形態での冗長符号データ列の算出を説明している。
【００３２】
図２及び図３を参照すればわかるように、本実施形態では、ビット列から取り出されたビットに対するビットシフトやデータマスク動作を行うことなく、ビット列をそのままベクトルとして扱ってベクトル間での排他的論理和計算を行うだけで、ガロア体演算を実行でき、冗長符号データ列Ｐ，Ｑを生成することができる。
【００３３】
図４は、図１に示した関連技術における冗長符号データ列の生成と本実施形態における冗長符号データ列の生成とを対比して示している。
【００３４】
図１に示す関連技術では、ガロア体演算は、通常、ビット単位に行われる。ビット単位でガロア体演算をＣＰＵで行う場合には、図４（ａ）に示すように、データのビットシフトやデータに対するマスク演算を必要とする。
【００３５】
これに対して本実施形態によれば、図４（ｂ）に示すように、ベクトルとして表されるビット列間での、ベクトル演算としての排他的論理和演算によって、ガロア体演算を行うことが可能になる。この際、ビットシフトやデータマスクなどの動作を行う必要はない。これにより、ＣＰＵで演算するに当たってビットシフト命令やデータマスク命令を実行しなくて済むことにより、本実施形態によれば、高速でガロア体演算を行うことが可能である。ガロア体演算を実行するための特殊なハードウェアがなくても、排他的論理和を演算することができるハードウェアを搭載していれば、それを利用してガロア体演算を行うことができる。さらに、上述した演算の過程においてどのビット列からデータ単位分のビットを取り出すかは、これらのビット列を格納しているメモリに対するアドレスを制御することによって選択することができる。一般に、メモリに対するデータバスのビット幅はＣＰＵにおける演算処理単位のビット幅と同じにされ、また本実施形態におけるデータ単位のビット幅は例えばＣＰＵにおける演算処理単位のビット幅と同じにされるので、結局、ビット列ごとに１回のメモリアクセスを行うことによって、データ単位分の冗長符号データ列におけるデータ単位分のビット列の計算に必要なデータを取り込むことができ、その点でも本実施形態によれば、ガロア体演算の高速化を達成することができる。
【００３６】
なお、ビット単位でガロア体演算を行うか、あるいは、ベクトル演算によってガロア体演算を行うかによって、同じデータに基づいて冗長符号データ列を生成しても、関連技術によって得られる冗長符号データ列と本実施形態によって得られる冗長符号データ列は、データ列として比較した場合には異なっている。しかしながら後述するように、本実施形態によって得られる冗長符号データ列も、関連技術と同様に、元のデータ列の復元に用いることができる。
【００３７】
なお上述の説明は、データ列ａ〜ｄに対してそれぞれ単位行列Ｉを対応させて冗長符号データ列Ｐを生成し、データ列ａ，ｂ，ｃ，ｄに対してそれぞれ行列Ｉ，Ｔ，Ｔ4，Ｔ2を対応させて冗長符号データ列Ｑを生成するものであるが、例えば非特許文献１，２に記載されるように、冗長符号列Ｐ，Ｑを生成する演算式はここで述べたものに限定されるものではない。例えば、冗長符号データ列Ｐの生成はここで述べたものと同じとし、データ列ａ，ｂ，ｃ，ｄに対してそれぞれ行列Ｉ，Ｔ，Ｔ2，Ｔ14を対応させて冗長符号データ列Ｑを生成するようにしてもよい。
【００３８】
図５は、本実施形態における冗長符号データ列生成の演算処理を実行するための基本的なハードウェア構成の一例を示すブロック図である。
【００３９】
このハードウェア構成は、演算手段として機能するＣＰＵ１００と、メモリ１１０と、アドレスバス１２０と、データバス１３０とを備えている。ＣＰＵ１００は、アドレスバス１２０に対してアドレスデータを出力するアドレス制御ユニット１０１と、データバス１３０に接続する複数のレジスタ１０２と、レジスタ１０２内のデータに対して四則演算や論理演算を実行するする演算論理ユニット（ＡＬＵ；Arithmetic Logic Unit）１０３とを少なくとも備えており、ＡＬＵ１０３内には、その排他的論理和計算を実行する排他的論理和演算器（ＸＯＲ）１０４が設けられている。ここでは、データバス１３０のビット幅と、ＣＰＵ１００における演算処理の単位となるビット幅すなわち１ワードのビット数とは一致しており、ＣＰＵ１００のビット幅をそのままガロア体演算でのデータ単位とする。
【００４０】
メモリ１１０は、アドレスバス１２０とデータバス１３０とに接続し、アドレスバス１２０上のアドレスデータによってメモリアドレスが指定されて、データバス１３０のビット幅単位でデータを読み書きできるようになっている。メモリ１１０の記憶領域は、データ列ａ，ｂ，ｃ，ｄ及び冗長符号データ列Ｐ，Ｑをそれぞれ格納する領域に分けられており、さらに、データ列ごとの格納領域は、上述したそれぞれのビット列の格納領域に細分化されている。図において、メモリ１１０の記憶領域のうちの例えばａ0と記載された領域は、ビット列ａ0が格納される領域である。
【００４１】
このハードウェア構成では、アドレスを指定することによってメモリ１２０からデータ単位分のビット列をＣＰＵ１００のいずれかのレジスタ１０２に取り込むことができる。そこで、メモリ１２０に格納したビット列に対して上述した一連の排他的論理和演算が行われるように、アドレス制御ユニット１０１によりアドレスを順次指定しながらビット列を各レジスタ１０２に取り込み、各レジスタ１０２に格納されたビット列に対して排他的論理和演算器１０４が排他的論理和演算を実行することにより、冗長符号データ列を構成するビット列が生成される。すなわちアドレス制御ユニット１０１は、上記の演算式に基づく排他的論理和演算が行われるようにメモリ１１０からビット列が取り出されるように、アドレス制御を行う。冗長符号データ列を構成するビット列は、レジスタ１０２とデータバス１３０を介して、メモリ１１０の所定の記憶領域に書き込まれる。この場合、ＣＰＵ１００においてビットシフトやデータマスク動作は行われず、したがって、高速に冗長符号データ列を生成することができる。
【００４２】
次に、上述した冗長符号生成方法を適用しＲＡＩＤシステムの構成の一例について、図６を用いて説明する。
【００４３】
ＲＡＩＤシステムには、Ｎを３以上の整数であるとして、それぞれデータ記録媒体であるＮ＋１個のディスク装置Ｄｉｓｋ  ０〜Ｄｉｓｋ  Ｎが設けられており、これらのディスク装置は、ディスク制御部５３０を介してＣＰＵ５１０に接続している。ＣＰＵ５１０は、上述した手法によってガロア体演算を行って冗長符号を生成するとともにディスク装置において障害が発生した場合に破損データの復元処理を行うものである。ＣＰＵ５１０にはメモリ５２０が接続している。メモリ５２０は、ＣＰＵ５１０においてガロア体演算を行う際のバッファとして使われる。以下では、ＲＡＩＤシステムでの一般的な用語に従って、冗長符号データ列のことをパリティデータと呼ぶ。
【００４４】
このＲＡＩＤシステムでは、ディスク装置には、データ及びそのデータから生成された冗長符号データが書き込まれる。ディスク制御部５３０は、各ディスク装置の操作（ディスク装置へのデータ書き込み及びディスク装置からのデータ読み込み）を行うための制御部である。
【００４５】
次に、図６に示したＲＡＩＤ装置の動作について、図７を用いて説明する。ここでは６台のディスク装置（Ｄｉｓｋ０〜Ｄｉｓｋ３，ＤｉｓｋＰ及びＤｉｓｋＱ）が設けられるものとし、ここでＤｉｓｋ０〜Ｄｉｓｋ３はデータを分散格納するためのディスク装置であり、ＤｉｓｋＰ及びＤｉｓｋＱは冗長符号に基づくパリティデータ（Ｐ符号列及びＱ符号列）がそれぞれ格納されるパリティディスク装置（冗長ディスク装置）である。
【００４６】
今回、動作を理解しやすくするために、以下の１バイト（＝８ビット）データをＤｉｓｋ０〜Ｄｉｓｋ３に書き込む場合を想定する。また、パリティデータ生成のための演算式として、図２にある行列演算式を使用する。通常、ＣＰＵは３２ビットもしくは６４ビット単位でデータを扱うため、ＣＰＵの演算処理単位のビット幅に演算のデータ単位を合わせたほうがより効率的に演算できるが、４バイト（＝３２ビット）のデータとなると要素数が非常に大きくなって説明が複雑になりすぎるため、ここでは１バイトをデータ単位とする場合を例に挙げて説明する。演算のデータ単位を３２ビット（＝４バイト）や６４ビット（＝８バイト）とする場合に下記の例を拡張することは容易である。以下の説明において、「0x」で始まっている数値は、「0x」の次の２文字により１６進表記で表されている各１バイトのデータである。ここでは、ディスクＤｉｓｋ０〜Ｄｉｓｋ３に以下のようにデータを分散配置するものとする。
【００４７】
Ｄｉｓｋ０：0x64，0x6F，0x40，0x48の４バイトのデータ（それぞれ、ａ0，ａ1，ａ2，ａ3とする），
Ｄｉｓｋ１：0x15，0x02，0x0F，0xD3の４バイトのデータ（それぞれ、ｂ0，ｂ1，ｂ2，ｂ3とする），
Ｄｉｓｋ２：0xE6，0x63，0x2C，0x08の４バイトのデータ（それぞれ、ｃ0，ｃ1，ｃ2，ｃ3とする），
Ｄｉｓｋ３：0x00，0x37，0x9B，0xACの４バイトのデータ（それぞれ、ｄ0，ｄ1，ｄ2，ｄ3とする）．
パリティ生成時の動作は以下のようになる。
【００４８】
メモリ５２０は、上記データのパリティ算出のためのガロア体演算及びディスク書き込みを行う際のバッファとして使用される。ＣＰＵ５１０はメモリ５２０からデータを読み込み、パリティ生成を行う。その際、上記データによって生成されるパリティは、図２に示した計算手法にしたがって、以下のように演算される。ここで"＋"は排他的論理和を表す。
【００４９】
Ｐ0＝0x64＋0x15＋0xE6＋0x00
＝0x97，
Ｐ1＝0x6F＋0x02＋0x63＋0x37
＝0x39，
Ｐ2＝0x40＋0x0F＋0x2C＋0x9B
＝0xF8，
Ｐ3＝0x48＋0xD3＋0x08＋0xAC
＝0x3F，
Ｑ0＝0x64＋0xD3＋0xE6＋0x08＋0x9B
＝0xC2，
Ｑ1＝0x6F＋0x15＋0xD3＋0xE6＋0x63＋0x08＋0x9B＋0xAC
＝0x13，
Ｑ2＝0x40＋0x02＋0x63＋0x2C＋0x00＋0xAC
＝0xA1，
Ｑ3＝0x48＋0x0F＋0x2C＋0x08＋0x37
＝0x54．
ＣＰＵ５１０は、演算したパリティをメモリ５２０にいったん格納し、次に、ディスク制御部５３０を通じて全データを各ディスク装置に格納する。その際、ビット列Ｐ0〜Ｐ3からなる冗長符号データ列ＰをＤｉｓｋＰに、ビット列Ｑ0〜Ｑ3からなる冗長符号データ列ＱをＤｉｓｋＱに書き込むようにする。ここでは説明の簡略化のためにどのディスク装置をパリティディスク装置にするかを固定しているが、パリティディスク装置を固定する必要は必ずしもない。
【００５０】
以上により、元のデータに基づいてパリティデータを生成することができ、パリティデータも含めてデータが各ディスク装置に分散配置されたことになる。
【００５１】
次に、図７を参照し、上述のようにデータが各ディスク装置に格納されているとして６台のディスク装置のうちの２台が故障した場合を想定し、残りのディスク装置からデータを復元することを考える。ここでは、Ｄｉｓｋ１及びＤｉｓｋ２が故障し、残りのＤｉｓｋ３、Ｄｉｓｋ４、ＤｉｓｋＰ及びＤｉｓｋＱからデータを復元することを考える。
【００５２】
Ｄｉｓｋ１及びＤｉｓｋ２が故障している状況において、ＣＰＵ５１０は、ディスク制御部５３０を通じて、Ｄｉｓｋ２，Ｄｉｓｋ３，ＤｉｓｋＰ及びＤｉｓｋＱからデータを読み込み、メモリ５２０に格納する。次にＣＰＵ５１０は、メモリ５２０からデータを読み込み、ガロア体演算を行い、データを復元し、復元後のデータをメモリ５２０に格納する。図１に示す行列演算式を使用した場合の復元パターンは、図８で表される。図８は、図７に示す６台のディスク装置を有する構成において、任意の１台または２台のディスク装置が故障した場合に、故障したディスク装置のデータを他のディスク装置のデータからどのように復元するかを示すガロア体乗算表である。故障したディスク装置が存在しない場合については、「故障なし」の欄で示されている。当然のことながら、正常なディスク装置に格納されているデータは、当該ディスク装置からそのまま読み出すことができる。この表での乗算は、ガロア体乗算であり、その乗算の係数は、原始根のべき乗の指数では、原始多項式の根をベクトル表示した際の値となっている。
【００５３】
図８の乗算表を参照することから分かるように、Ｄｉｓｋ０及びＤｉｓｋ１が故障した場合に、他のディスク装置を用いてＤｉｓｋ０及びＤｉｓｋ１のデータを復旧するための用いられる復元行列は、図９で示されるものとなる。図９において、セクタ列ｃは、Ｄｉｓｋ２から読み出されたデータ列のことであり、ここではＧＦ(２4)上での演算を前提としているので、冗長符号データ列を生成する場合と同様に、ビット列ｃ0，ｃ1，ｃ2，ｃ3から構成されている。セクタ列ｄ，Ｐ，Ｑも、それぞれ、Ｄｉｓｋ３，ＤｉｓｋＰ及びＤｉｓｋＱから読み出されたデータ列であって、いずれも４つのビット列から構成されている。これらのビット列は、上述したデータ単位分の要素を有する横ベクトルとして扱えるものである。そして、図９に示す式に従って演算を行うことにより、ビット列ａ0，ａ1，ａ2，ａ3からなるデータ列ａと、ビット列ｂ0，ｂ1，ｂ2，ｂ3からなるデータ列とが復元されることとなり、Ｄｉｓｋ０及びＤｉｓｋ１に格納されていたデータが復元できたことになる。図９の復元行列を今回の場合に当てはめると、故障したディスク装置Ｄｉｓｋ０及びＤｉｓｋ１に格納されていたデータは、以下の式に示されるように復元される。
【００５４】
ａ0＝ｃ1＋ｃ2＋ｃ3＋ｄ3＋Ｐ0＋Ｐ1＋Ｐ2＋Ｐ3＋Ｑ1＋Ｑ2＋Ｑ3，
ａ1＝ｃ0＋ｃ1＋ｄ0＋ｄ3＋Ｐ0＋Ｑ0＋Ｑ1，
ａ2＝ｃ0＋ｃ1＋ｃ2＋ｄ1＋Ｐ0＋Ｐ1＋Ｑ0＋Ｑ1＋Ｑ2，
ａ3＝ｃ0＋ｃ1＋ｃ2＋ｃ3＋ｄ2＋Ｐ0＋Ｐ1＋Ｐ2＋Ｑ0＋Ｑ1＋Ｑ2＋Ｑ3，
ｂ0＝ｃ0＋ｃ1＋ｃ2＋ｃ3＋ｄ0＋ｄ3＋Ｐ1＋Ｐ2＋Ｐ3＋Ｑ1＋Ｑ2＋Ｑ3，
ｂ1＝ｃ0＋ｄ0＋ｄ1＋ｄ3＋Ｐ0＋Ｐ1＋Ｑ0＋Ｑ1，
ｂ2＝ｃ0＋ｃ1＋ｄ1＋ｄ2＋Ｐ0＋Ｐ1＋Ｐ2＋Ｑ0＋Ｑ1＋Ｑ2，
ｂ3＝ｃ0＋ｃ1＋ｃ2＋ｄ2＋ｄ3＋Ｐ0＋Ｐ1＋Ｐ2＋Ｐ3＋Ｑ0＋Ｑ1＋Ｑ2＋Ｑ3．
この復元式に対して具体的な数値を代入すると、以下のようになる。
【００５５】
ａ0＝0x63＋0x2C＋0x08＋0xAC＋0x97＋0x39＋0xF8＋0x3F＋0x13＋0xA1＋0x54
＝0x64，
ａ1＝0xE6＋0x63＋0x00＋0xAC＋0x97＋0xC2＋0x13
＝0x6F，
ａ2＝0xE6＋0x63＋0x2C＋0x37＋0x97＋0x39＋0xC2＋0x13＋0xA1
＝0x40，
ａ3＝0xE6＋0x63＋0x2C＋0x08＋0x9B＋0x97＋0x39＋0xF8＋0xC2＋0x13＋0xA1＋0x54
＝0x48，
ｂ0＝0xE6＋0x63＋0x2C＋0x08＋0x00＋0xAC＋0x39＋0xF8＋0x3F＋0x13＋0xA1＋0x54
＝0x15，
ｂ1＝0xE6＋0x00＋0x37＋0xAC＋0x97＋0x39＋0xC2＋0x13
＝0x02，
ｂ2＝0xE6＋0x63＋0x37＋0x9B＋0x97＋0x39＋0xF8＋0xC2＋0x13＋0xA1
＝0x0F，
ｂ3＝0xE6＋0x63＋0x2C＋0x9B＋0xAC＋0x97＋0x39＋0xF8＋0x3F＋0xC2＋0x13＋0xA1＋0x54，
＝0xD3．
以上により、Ｄｉｓｋ０及びＤｉｓｋ１が故障した場合に、残りのデータと本実施形態に基づく冗長符号生成によるパリティとを用いることにより、故障したディスク装置に格納されていたデータ（ビット列ａ0〜ａ3，ｂ0〜ｂ3）を復元できることが証明された。ここでは詳細を示さないが、本実施形態による冗長符号生成法によって生成したパリティデータを用いて上述と同様の演算を実行することにより、故障したディスク装置が２台以下であれば、どのディスク装置が故障したとしてもデータを復元することができる。
【００５６】
図９に示す演算式は、それぞれベクトルとしてビット列に対して作用される行列が異なっている点を除けば、図２に示した演算式と同様のものである。したがって、図９に基づきガロア体演算によってデータ列ａ，ｂを復元する場合には、ビットシフトやデータマスク動作などを行うことなく、排他的論理和のみでデータ列の復元を行えることが分かる。データ列の復元のための演算処理は、例えば、図５に示した構成のハードウェアを用いて実行することができる。
【００５７】
故障が発生したディスク装置Ｄｉｓｋ０及びＤｉｓｋ１が、図７の下段に示すように正常なディスク装置Ｎｅｗ  Ｄｉｓｋ０及びＮｅｗ  Ｄｉｓｋ１にそれぞれ交換されると、ディスク制御部５３０は、復旧されたデータを交換後のＮｅｗ  Ｄｉｓｋ０及びＮｅｗ  Ｄｉｓｋ１に書き込む。これら一連の動作により、故障によって損失されたデータの復元が完了する。
【００５８】
以上、ディスク装置Ｄｉｓｋ０及びＤｉｓｋ１が故障したときのデータ復元動作を説明したが、図８に示すガロア体乗算表から明らかなように、図７に示す６台のディスク装置を有するＲＡＩＤシステムにおいて、任意の１台または２台のディスク装置が故障した場合には、ここで述べたものと同様の処理を行うことによって、故障したディスク装置に格納されていたデータを復元することができる。
【００５９】
図１０は、ＲＡＩＤシステムの別の構成例を示している。図１０に示したものでは、ＣＰＵ５１０の内部において、通常のＡＬＵ（論理演算ユニット）とは別個に、排他的論理和演算器（ＸＯＲ）５４０が搭載されている。冗長符号データ列の算出やデータ列の復元に際しては多数回の排他的論理和演算を行う必要があるが、ＣＰＵ５１０においてＡＬＵとは別個に排他的論理和演算器５４０を設けることによって、ＣＰＵ５１０において、ガロア体演算のために排他的論理和演算が、ＣＰＵ５１０における他のプロセスの演算とは別個に行えるようになり、より高速にガロア体演算を実行することが可能になる。
【００６０】
図１１は、ＲＡＩＤシステムのさらに別の構成例を示している。図１１に示したものでは、ＣＰＵの外部に、すなわちＣＰＵとは別個に排他的論理和演算器（ＸＯＲ）５４０が配置されている。この構成では、ＣＰＵではなく外部の演算器によって排他的論理和を計算するので、ＣＰＵの動作とは無関係にガロア体演算を行うことができ、さらに高速にガロア体演算を実行することが可能になる。なおこの構成では、ガロア体演算に用いられるビット列は、メモリ５２０から、例えばＤＭＡ（ダイレクト・メモリ・アクセス；Direct Memory Access）の手法を用いて排他的論理和演算器５４０に対して直接供給することができる。
【符号の説明】
【００６１】
１００，５１０    ＣＰＵ
１０１    アドレス制御ユニット
１０２    レジスタ
１０３    演算論理ユニット（ＡＬＵ）
１０４，５４０    排他的論理和演算器（ＸＯＲ）
１１０，５２０    メモリ
１２０    アドレスバス
１３０    データバス
５３０    ディスク制御部
【図１】
2010239404.tif 000004
【図２】
2010239404.tif 000005
【図３】
2010239404.tif 000006
【図４】
2010239404.tif 000007
【図５】
2010239404.tif 000008
【図６】
2010239404.tif 000009
【図７】
2010239404.tif 000010
【図８】
2010239404.tif 000011
【図９】
2010239404.tif 000012
【図１０】
2010239404.tif 000013
【図１１】
2010239404.tif 000014