ITで理解する「パリティ」——基本からRAID/メモリ/プロトコル実装まで徹底解説

パリティとは何か — 基本概念

パリティ(parity)は、デジタル情報の誤り検出や冗長性を確保するための最も基本的な仕組みの一つです。一般的にはビット列の「偶奇(0/1 の数が偶数か奇数か)」を表す付加ビットを指し、通信やメモリ、ストレージなどで単純なエラー検出や、冗長情報の計算に使われます。

基礎的な仕組み — 偶性パリティと奇性パリティ

パリティビットは通常、送信するデータの全ビットを XOR(排他的論理和)して算出します。得られた値を 0/1 のいずれかに調整して「偶性(even parity)」または「奇性(odd parity)」を作ります。

  • 偶性パリティ(even parity): データビットとパリティビットを合わせた1 の数が偶数になるようにする。
  • 奇性パリティ(odd parity): データビットとパリティビットを合わせた1 の数が奇数になるようにする。

例: データ 1011(1 が3つ)は奇数なので、偶性パリティを付ける場合はパリティビットを1にして合計が4(偶数)になるようにする。

通信プロトコルにおけるパリティ

シリアル通信(UART 等)では、1 ビットのパリティは古典的な誤り検出手段です。パリティはシンプルでハードウェア実装が容易ですが、検出できるのはビット反転が奇数回起きた場合のみで、偶数回のエラー(2ビット反転など)は検出できません。そのため、ノイズの多い回線や高信頼性を要求する用途では CRC(巡回冗長検査)など強力な検査に置き換えられます。

CPU のパリティフラグと演算

一部のプロセッサは算術演算の結果に対してパリティフラグ(Parity Flag, PF)を持っています。x86 アーキテクチャでは、低 8 ビットの結果に含まれる 1 の数が偶数か奇数かを示すために PF が利用され、主にソフトウェアでの条件分岐や特定の命令セット互換のために使われます。これは誤り検出用のパリティとは目的が異なり、演算結果の性質を示すフラグです。

メモリにおけるパリティと ECC(誤り訂正コード)

古いサーバや一部業務用メモリでは『パリティメモリ』が使われてきました。これは各バイトに対して1ビットのパリティを付加し、単一ビットのエラー(1ビット反転)を検出しますが、訂正はできません。対して ECC メモリはハミング符号などを用い、単一ビット誤りを訂正し、二重ビット誤りを検出する機能を提供します。

  • パリティ: 検出のみ(単一ビットは検出可、訂正不可)
  • ECC: 検出と訂正(代表的には1ビット訂正+2ビット検出など)

サーバ用途では、Silent Data Corruption(静かなデータ破損)を防ぐために ECC が標準的です。パリティだけでは潜在的なデータ破損を見逃すリスクがあります。

ストレージの世界 — RAID におけるパリティ

RAID(Redundant Array of Independent Disks)では、パリティはデータ冗長性を実現する要となります。代表的なのは RAID5。RAID5 は複数ディスクにデータブロックを分散し、各ストライプごとに1つのパリティブロック(XOR パリティ)を持ちます。失われたディスクのデータは残りのデータブロックを XOR することで再構成できます。

RAID5 の基本原理(単純化):

  • 各ストライプ: D0, D1, ..., Dn, P
  • P = D0 XOR D1 XOR ... XOR Dn
  • 任意の1つのディスクが故障しても、欠けたブロック = XOR(残りのブロック + P)

これは非常に効率的ですが、1ディスク故障中にもう1ディスクが壊れるとデータ損失が発生します。そこで RAID6 では『二重パリティ』を導入し、2ディスク同時故障にも耐えられるようにしています。RAID6 のパリティ計算は単純な XOR の他に、Reed-Solomon 符号(ガロア体を用いる)などを用いる実装があり、これにより異なる種類の冗長情報(P と Q)が得られます。

RAID における実運用上のトピック

・再構築(rebuild): 故障したディスクからの復元時に、残りのディスクを読み出し XOR 演算で失われたデータを作り出します。容量と読み取りの多さにより時間が長くなり、その間は二次故障リスクが高まります。
・ライトペナルティ: RAID5 のランダムライトは「読み出し→更新→パリティ再計算→書き込み」の read-modify-write サイクルが必要なため書き込み性能にペナルティがあります(一般に 4 I/O が発生)。これは RAID コントローラやキャッシュ、オフロード機構で軽減されます。
・ライトホール問題(write hole): 電源障害やクラッシュで一部のデータと対応するパリティの更新が不整合なままになる現象。対策としてジャーナリング、バッテリ/フラッシュバックアップ付きキャッシュ、あるいは ZFS のような copy-on-write ファイルシステム(RAID-Z)で不整合を防ぎます。

数学的背景 — XOR とガロア体

単純パリティは XOR の性質に依存します。XOR は可逆で、同じ値をもう一度 XOR すると元に戻る(a XOR a = 0, a XOR 0 = a)ため、欠損値の再構築が可能です。一方、二重パリティ(RAID6 等)やより強力な符号は有限体(Galois Field, GF(2^m))上での多項式演算を利用し、より複雑な冗長性と訂正能力を実現します(Reed-Solomon 符号など)。

パリティの限界と代替技術

パリティは低コストで有効ですが、限界も明確です。単一ビットの検出しかできない単純パリティや、RAID5 の再構築時間とリスク、書き込み性能の低下などが挙げられます。近年は次のような対策・代替が使われます。

  • ECC メモリ: メモリにおける信頼性向上。
  • CRC/強力なチェックサム: 検出力の強化(ネットワーク/ストレージ)。
  • ZFS/RAID-Z: コピーオンライトと強力なチェックサムで write hole を防ぎ、サイレントデータ破損を検出する。
  • RAID6(P+Q)や分散ストレージの冗長アルゴリズム(Erasure Coding): 大規模ストレージでの耐故障性向上。

実装上の考慮点

・ハードウェアオフロード: RAID コントローラやCPUのSIMD命令で XOR 処理を高速化することでパリティ計算コストを減らす。
・データ整合性の検査: 定期的なスクラビング(scrubbing)でディスク上のビットロットを検出・修復する。
・ログとメタデータ保護: パリティだけでなく、メタデータの整合性確保が重要。不整合が発生すると復旧が困難になる。
・性能評価: ランダム書き込みや小さなブロック書き込みではパリティを伴うRAIDは性能劣化が目立つ。ワークロードに応じた設計が必要。

まとめ — どこでパリティを使うべきか

パリティはシンプルで低コストな冗長性・誤り検出の手段として依然重要です。通信や低レベルな誤り検出、RAID5 のようなストレージ冗長化など多くの場面で有効です。ただしシンプル故に検出能力や訂正能力に限界があり、用途に応じて ECC、CRC、Reed-Solomon、Erasure Coding、あるいは ZFS のような総合的なデータ整合性機構と組み合わせることが推奨されます。

参考文献