ECCとは何ですか。また,PentiumUにはECCがあるものとないものがあるようですが,どちらを選んだらいいのでしょうか。
PCのメインメモリのDRAMチップには信頼性の高いものが利用されています。しかし,それでもノイズなどで記憶内容が破壊されたり,故障を起こす可能性はあります。メモリの記憶内容が破壊されると,CPUは命令の実行やデータの読み取りを正常に行うことができず,処理が継続不可能になります。
現在,メモリエラーの場合の一般的な対処方法は二つあります。一つは,PCでは以前から標準的に使われていたパリティビットを保存する方法(パリティ付きメモリを使う),そしてもう一つは,質問にあるECC(Error Correcting Code)を使用する方法です。
パリティを使う方法では,例えば8ビットデータを合算したとき,その結果が偶数なら0,奇数なら1を保存します。データが破壊されると,保存してあるパリティと整合性がとれなくなるため,エラーが発生したことが分かる仕組みです。ただし,この例でいえば8ビットのうち,2ビットにエラーがあるとそれを検出できない可能性があります。また,エラーを検出できても訂正することはできません。
一方ECCはエラー検出に加え,名前のとおりエラー訂正を行う機能も持っています。少し具体的な例を挙げてみましょう。理解を容易にするため,データ4ビットに対して3ビットのECCを保存するケースを想定します。
4ビットのデータが取り得る値は16通り,3ビットECCが取り得る値は8通りですから,一つのECC値に対して二つのデータが対応しています。この状態で,CPUがメモリに1111というデータを書き込み,同時にそのデータに対応するECC値として000を書き込みました。このとき,ECC値000は1111と0000の2個のデータに対応するとします。
一般にメモリ内部では,データの中の1ビットだけが反転するエラーが最も多く,先に保存したデータがエラーを起こした場合に取り得る値は0111,1011,1101,1110の4通りです。
CPUがデータを読もうとしたときにエラーが起こり,例えば0111になっていると,ECC値との対応が異なるのでエラーであることが分かります。また,ECC値000でエラーの値が0111なので,元のデータは1111しかないことが分かり,エラーを訂正できます。
同時に,この例の場合,4ビット中2ビットにエラーがある場合は訂正できず,3ビットにエラーがあれば誤った値を取り得ることも分かります。1ビット以上のエラーが起こることは非常にまれですが,ECCを使った場合でもエラーを完全に取り去ることはできないのは事実です。
ところで,この例では4ビット中1ビットのエラーを訂正できる代わりに,ECCを保存するために膨大なメモリ容量が必要になります。一般には64ビット中1ビット程度のエラー訂正ができれば十分です。これなら,64ビットデータに対して7ビットのECCがあれば対応できます(電卓で計算してみてください)。
ECCに対応するCPUには,ECC値の保存やECC値を使ったエラー訂正を行う「エラー訂正デコーダ」が付加されています。PentiumUの場合,外部クロック100MHz以上の製品ならば全製品がECCに対応しますが,ECC機能を使うには,ECCの保存領域を持つメモリ(ECC対応メモリモジュール)が必要です。
ECC付きとECCなしのどちらがいいかは,一概にはいえません。そのユーザーがECCがもたらす信頼性を必要とするかどうかによります。
ECCを使えばメモリエラーからPCを保護できる確率が上がりますが,その分だけメモリが必要になるのでコストがかさむので一長一短です。エラーが致命的な用途(サーバーなど)ならECCは必須ですが,ホビー用途では不要でしょう。メモリの信頼性は,ホビー用途で問題になるほど低くはないからです。
(米田 聡)