はじめに
メモリは大容量のデータを高速でやりとりしているわけですから、どっかで間違えたりしているかもしれません。ゲームをやっているなら1bitくらいの間違いはどうってことないでしょうけれども、契約書類のデータが書き換わってたらエライコトですし、学術計算の大プロジェクトで計算結果が違っていたらそれこそ大変です。
コンピュータのメインメモリではそのような事がないように、データ通信そのものを信頼性の高いものにするだけでなく、万が一エラーがでても発見できるような仕組みが考案されています。
パリティ
一昔前のパソコンではパリティ有りとパリティなし(Non-Parity 通称ノンパリ)があって、機種によってどちらか片方しか使えないなど気をつけなければならない点でした。最近では全てパリティ有りになったのでパリティという言葉自体聞かなくなりましたが、メモリの信頼性向上させる重要な技術で、後述のECCとも密接に関わります。
パリティとは、通常のデータに加えてエラー訂正用のパリティを付け加えてエラーが起きても発見できるようにする技術です。通常のメモリでは8bitのデータにつき1bitのパリティを加えて合計が偶数になるようにします。
データ | パリティ | 合計 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
bit | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 偶数 |
データ | パリティ | 合計 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
bit | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 偶数 |
仮にこの中で1つエラーが発生してそのビットが反転したとすると、合計が奇数となるのでエラーが発生したことが分かります。ただし、どこがエラーなのかは分からないので、もう一度データの読み込みなり書き込みなりをやり直す必要があります。また、同時に2つ以上発生した場合はエラーの数が偶数だと発見できないという欠点を持ちます。
ECC
パリティの欠点は、エラーが発見できても修復ができない点と、同時に発生した2個以上で偶数個のエラーは発見すらできないという点でした。そこでパリティをもう一組もうけることで、1つのエラーならば修復ができ、2個以上でも高い確率で発見できる仕組みを取り入れたのがECCメモリです。ECC=ErrorCheck and Correctの事で、エラーを検出して修正するという意味ですからそのまんまですね。
先ほどは8bitのデータに1bitのパリティを組み合わせましたが、それを8セット束ねて1セットのパリティを組み合わせます。この方法は水平パリティと垂直パリティと呼ばれメモリ以外でもよく使われるエラー訂正の仕組みです。
データ | パリティ | 合計 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
データ | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 偶数 |
1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 偶数 | |
1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 偶数 | |
0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 偶数 | |
0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 偶数 | |
0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 偶数 | |
1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 偶数 | |
1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 偶数 | |
パリティ | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 偶数 |
合計 | 偶数 | 偶数 | 偶数 | 偶数 | 偶数 | 偶数 | 偶数 | 偶数 | 偶数 |
上の表のように考えれば、仮に1つのエラーが発生した場合にはエラーが発生したビットの縦横でエラーが検出されるので場所が特定できます。また、2ヵ所以上偶数で発生してもかなりの精度で検出することができます。
ちなみに、これでも2つ以上偶数の行と2つ以上偶数の列でそれぞれ重なるbitですべてでエラーが発生したら検出できませんが、まぁそこまでエラーが発生するようならもはやマトモに動作できない状況かと。
なお、8個のデータに対して1つのパリティという構成なので、通常メモリモジュールを作る際には8個のメモリチップに1個のパリティ(ECC)用メモリチップを加えてECCメモリとします。
DIMMモジュールで片面に最大で9個乗るような構造になっているものをよく見かけますが、これはECC有りとECCなしの両方のメモリで基盤を共通設計にしているためで、8個のデータ用メモリチップと、1個のパリティ用(ECC用)メモリチップが片面に搭載できるように設計されているのです。なお、この場合はECCなしのモジュールは中央にECC用メモリチップのための空きパターンがあります。
ECCって必要なの?
メモリのエラーは大きく分けて、メモリチップ自体に問題があって値がおかしくなるハードエラーと、宇宙線などの放射線によって値が変わってしまうソフトエラーの2つがあります。このうち、ECCメモリの効果が有効なのは後者のソフトエラーに対してになります。
いたってマジメなサイエンス話に、宇宙線が登場してくるとは思いませんでした。沖○艦長を死に至らしめた、あの宇宙放射線ですね(笑)。私もにわかに信じられなかったのですが、これは事実のようでソフトエラーのほとんどが太陽からの宇宙放射線が原因らしいのです。
ちなみにECC対応のマシンではECCエラーのエラーレポート機能が実装されているものがあるのですが、太陽の活動周期と同期して日本全国で一斉にECCエラーがレポートされるとか、東海村で臨界事故が起こった時には筑波市周辺で多くのECCエラーのレポートが出たなど、ソフトエラーと放射線を結びつける事例は数多くあるようです。
で、このソフトエラーなんですが通常の容量を搭載しているコンピュータならば、多くても年に5回以下とされています。本来なら容量に比例して増えるので最近の大容量化に伴って無視できない存在となるところですが、メモリメーカーの技術進歩で、容量が増えても5回以下に抑えられているようです。なお、ソフトエラーはランダムにメモリ全体で発生するので、ソフトエラーが発生したビットが未使用の領域だった場合は全く影響を受けないことになりますし、仮に発生しても多くの場合は致命的な結果にはならないことが多いようです。
コンシューマ向けのパソコンのほとんどでECCなしのメモリが使われていることからも、一般用途ではあって困るモノじゃないが無くても問題ないものと考えるのが妥当なところなようです。最悪ブルーバックで再起動ですが、べつにECC有りにしたからといって、妙なアプリケーションやドライバによって引き起こされるブルーバックが減るわけでもないのでその効果は微々たるモノです。
ただし、ノンストップで稼働させる必要性がある業務用サーバーや結果に長時間の計算が必要で間違いが許されない学術的な演算などに使う場合は話が別です。これらの用途では、ECC有りにすることによって生じるコストを保険として投資するに見合うだけの仕事をさせると考えればECC有りを選択するのが賢明でしょう。
余談ですが、シャンクスという数学者が生涯をかけて円周率を求めたのですが、途中で計算を間違えており20年以上その間違った値を計算し続けたという悲しい話があります(この方は最期までその事に気づかなかったので本人は幸せだったのかもしれませんが)。