インストラクター：このレッスンでは､
エラー訂正コードとして知られるECCメモリーについてお話しします｡
しかし､ その前に､ メモリの観点からノンパリティとパリティの概念をカバーする必要がある｡
さて､ ノンパリティといえば､ これは単なる標準的なメモリである｡
エラーをチェックせず､
データを自由にメモリに入れたり取り出したりできる｡
ノンパリティは製造コストが非常に安く､
パリティ・メモリーよりも高速だ｡
一方､ パリティ・メモリは､
基本的なエラー・チェックを行い､ メモリ内容の信頼性と整合性を確保するために使用される｡
このため､ このメモリはノンパリティ・メモリよりも遅くなるが､
サーバーや特定のハイエンド・デスクトップ・ワークステーションに必要とされる信頼性を備えている｡
パリティ・チェック機能を持つメモリは､
データが正常かどうかを確認するために､
目に見えるものから基本的な計算を行うことができる｡
そして､ そのデータが良いものであれば､ それを使う｡
そうでない場合､ エラーは発生するが､ それを修正することはできない｡
エラーが発生しましたが､ 修正方法はわかりません｡
基本的に､ これは各バイトにパリティ・ビットを持たせることで機能する｡
つまり､ 8ビットの代わりに､ 8データビット＋パリティ用1ビットで9ビットになる｡
これで､ パリティ・ビットが適切なタイミングでセットされることになる｡
そして､ メモリから読み出すときに､
そのデータが最後にメモリに書き込まれたときからビットのどれかが変わったかどうかを計算し､
比較する｡
しかし､ このようなチェックは､
シングル・ビット・エラーの検出に限定される｡
なぜなら､ ビットは0か1しかないからだ｡
例えば､ 2進数で00000000と書かれた数字0を保存したとしよう｡
これらのビットをすべて足すと､ 8つの0が得られ､
パリティ・ビットは0となる｡
その数字をメモリから読み出そうとしたとき､
0が8つあることがわかった｡
さて､ 一方では､
私が00000001と書かれた数字の1を書き留めていたとしよう｡
これらの数字を足すと1になる｡
そして､ 私はそれを第9ビットのパリティ・ビットに入れる｡
こうすることで､ そこから読み取ると00000001が得られる｡
しかし､ もしそのデータをメモリに入れて数時間放置し､
誤って1が0に変わってしまったとしたら......今そのデータを読むと00000000となり､ それを足すと0となる｡
この8ビットのうち､ どれが変更されたのかはわからないが､
少なくとも1つは変更されている｡
一方､ 00000001の数字が01010001のように変更された場合､
メモリによって誤って0から1に変更されたビットが2つあることになる｡
パリティを見ると､ 奇数ならパリティビットは1になる｡
それを足して偶数になれば0になる｡
つまり､ パリティ・タイプの計算を使用している場合､
この内部で2ビットが変更されたとしてもエラーを検出することはできない｡
さて､ 良いニュースとしては､ ほとんどのエラーの約90％はシングル・ビット・タイプのエラーであり､
パリティ・チェックは通常､ ほとんどの状況で十分であるということだ｡
しかし､ 銀行でサーバーを運用するような場合は､
どんなエラーも悪いことになりかねない｡
そこで､ パリティよりも優れたものが必要になり､
ECCが登場するわけだ｡
ECCはError Correcting Codeの略である｡
誤り訂正符号は､ パリティを次のレベルに引き上げるタイプのメモリである｡
パリティのようにエラーを検出するだけでなく､
そのエラーを修正することもできる｡
ECCはパリティより少し遅く､
ノンパリティより遅い｡
ECCはエラーを検出し､
エラーを修正することができるため､ ECCを使用することでメモリから高い整合性と信頼性を得ることができる｡
一般的に､ ECCやエラー訂正コードが使われるのは､
追加コストがかかるため､ 本当にハイエンドのワークステーションやサーバーに限られる｡
さて､ ECCは実際に何が問題で､
どう修正すべきかをどのように判断するのだろうか？
そのためには､ バッファード・メモリやレジスタード・メモリと呼ばれるものを使う｡
バッファード・メモリやレジスタード・メモリには､
メモリとCPUやプロセッサーの間に位置する追加のハードウェアがある｡
このハードウェアはレジスタと呼ばれ､
CPUに送られる前のデータをバッファに格納する｡
この機能は､ 多くのシステム､ 特にサーバーのようにエラーが発生する可能性のあるメモリモジュールを多数搭載しているシステムの信頼性対策として使用されている｡
これらのシステムでは､ 大容量のメモリモジュールを搭載したシステムで使用される電気的負荷を軽減するために､
データのバッファリングや登録が必要となる｡
また､ パリティやエラー訂正コード・メモリと組み合わせることで､
さらなる信頼性を確保し､ エラーを検出することができる｡
エラー訂正コードモジュールを使用するには､ CPUだけでなくマザーボードも対応していなければならない｡
これらのコンポーネントのいずれかがECCをサポートしていない場合､
より高価なECCモジュールを購入しても､ ECCの恩恵を受けることはできません｡
だから､ そのことを覚えておいてほしい｡
また､ ほとんどのマザーボードはECCをサポートしているか､ していないかのどちらかだ｡
一般的には選択肢に入らない｡
つまり､ ECCをサポートするマザーボードを購入するのであれば､
ECCモジュールを購入しなければならない｡
ECCまたは非ECCモジュールをサポートするマザーボードを見つけたとしても､
一般的には両方を同時にサポートすることはない｡
つまり､ すべてのモジュールがECCでなければならないか､
どのモジュールもECCであってはならないのだ｡
それらが混在していると､ システムにエラーが発生し､ マザーボードがそれをどう処理すればいいのかわからなくなる｡
さて､ 最後に触れておきたいのは､
DDR5を使用している場合､ DDR5にはモジュール自体に内部エラーチェック機能があるということだ｡
これはECCやECCモジュールとはみなされない｡
そのため､ 新しいDDR5モジュール内のこのエラー訂正は､
ECCをサポートしていないマザーボードでも使用でき､ エラーチェック機能は残っている｡
これはエラーチェックとは異なるもので､
エラー訂正コードとはみなされない｡
だから､ そのことを覚えておいて､ フィールドに出たときに混乱しないようにしてほしい｡
DDR5モジュールは､ 内部エラーチェックに加え､
CPUやマザーボードがECCをサポートしていれば､
そのCPUやマザーボードとも連動し､ エラー訂正コードも使用されるため､ ECCモジュールとしても非ECCモジュールとしても販売される｡
少し混乱するのは分かっている｡
だから､ フィールドに出るときはそのことを意識してほしい｡