ヤコビアン
パリティチェックについて教えてください
パリティチェック(パリティビットを用いたエラ検出)は、データ通信やメモリなどで利用される最も基本的な誤り検出手法の一つです。以下では、パリティチェックの概要から具体的な仕組み、応用例、メリット・デメリットまでを段階的に解説します。
—
## 1. パリティチェックとは
* **定義**
パリティチェックは、送信側が送信データに「パリティビット(Parity Bit)」と呼ばれる1ビットを付加し、受信側でデータを受け取った際にそのパリティビットとデータビット全体のビット数の“偶奇”を再計算して、ビット誤り(ビット反転など)が起きていないかを検出する仕組みです。
* **目的**
主に「ビット単位の誤り(たとえばノイズによって1ビットだけ0→1、あるいは1→0へ反転するような誤り)」を検出することが目的であり、検出した誤りを自動的に訂正する機能はありません(誤り検出後、再送要求や上位レイヤーでの対処が必要)。
—
## 2. パリティの種類
パリティチェックには大きく分けて2種類の方式があります。
1. **偶数パリティ(Even Parity)**
* データビットとパリティビットを合わせた全体の“1ビットの総数”が必ず「偶数」になるようにパリティビットを設定します。
* 例:データビットが の場合、データ中の“1”は4個なので既に偶数。→ パリティビットには を付加(結果 )。
* もしデータ中の“1”が奇数個だった場合は、パリティビットを にして全体を偶数個にします。
2. **奇数パリティ(Odd Parity)**
* データビットとパリティビットを合わせた全体の“1ビットの総数”が必ず「奇数」になるように設定します。
* 例:データビットが の場合、データ中の“1”は4個(偶数)。→ パリティビットに を付加して “1 ビット” を足し、合計5個(奇数)にする(結果 )。
* もしデータ中の“1”がすでに奇数個だった場合は、パリティビットに を付加します。
どちらを用いるかはシステム設計や規格によって決まりますが、誤り検出率そのものに差はありません。奇数・偶数の選び方は通信プロトコルの取り決めによります。
—
## 3. 単一ビット・パリティチェックの手順
### 3.1 送信側での処理
1. 送信したいデータを一定のビット長(例:8ビット、16ビット、32ビットなど)で区切る。
2. 各ブロックごとに「データビット中の“1”のビット数」を数える。
3. 偶数パリティなら「データ中の“1”の数」が偶数になるようにパリティビット(0 または 1)を付与、奇数パリティなら「奇数になるように」付与する。
4. 最終的に、データブロック+パリティビットを送信する(合計ビット数は “データビット長+1” になる)。
例:
* 送信データ(8ビット)のみ:
“
* 偶数パリティを使う場合:
* データ中の “1 が 4 個” = 偶数 → パリティビットは 0
* 送信ビット列 = (合計 9 ビット)
* 奇数パリティを使う場合:
* データ中の “1 が 4 個” = 偶数 → パリティビットは 1 で全体を “奇数個 (5 個)” に
* 送信ビット列 = (合計 9 ビット)
### 3.2 受信側での処理
1. 送られてきた「データビット+パリティビット」を受け取る(例:9ビット受信)。
2. データビット部分の “1 の数” を再度カウントし、付属のパリティビットと合わせた合計が “偶数” か “奇数” かを確認。
3. 送信時と同じ「偶数パリティ/奇数パリティを用いる」という前提で、整合性が取れていればエラーなしと判断。
4. 整合性が取れていなければ「ビット誤りが発生した可能性あり」と判断し、上位レイヤーに再送やエラー処理を依頼する。
—
## 4. パリティチェックの応用例・使われ方
パリティチェックはシンプルで実装コストが低いため、古くから様々な場面で利用されてきました。主な応用例は以下の通りです。
1. **シリアル通信(RS-232Cなど)**
* 1バイトごと(8ビット)のデータに対して1ビットのパリティを付加し、通信中のビット誤りを検出します。
* 構築が容易で伝送オーバーヘッドもわずか 1/8(12.5%)なので、古典的な通信規格で広く採用。
2. **メモリのECC(Error Correction Code)/パリティビット**
* サーバーや組み込み機器のDRAMで、単体のパリティビット(シングルパリティ)を使っているものもあります(※より高信頼性を要求する場合は「ECCメモリ」が用いられ、複数ビットの誤り訂正が可能)。
* パリティビットだけの場合は「シングル・ビット誤りの検出まで」であり、訂正はできませんがコストが抑えられるため、一部の産業用機器・低価格PCなどでまだ利用されるケースがあります。
3. **RAID 2(現在ほぼ廃れているが理論上の例)**
* RAID の方式のひとつとして、“メモリーチップ型”のパリティビットを複数使い、ビット単位でエラー訂正ができる仕組みを取っていました。ただし、コスト・複雑度の面から実運用ではほとんど使われません。
4. **衛星通信・無線機器の簡易エラ検出**
* 途切れやすい無線回線などで、パケットの一部としてパリティを付与し、受信時のビット誤りを検出。再送制御に利用されることがあります。
—
## 5. パリティチェックのメリット・デメリット
### メリット
* **実装コストが非常に低い**
* たった1ビットの追加で済むため、回路のゲート数も最小限で済む。組み込み機器やレガシーなハードウェアでも容易に導入可能。
* **誤り検出用としては十分に有効(単一ビットエラー)**
* 通常のノイズや伝送時の単一ビット・フリップ(0→1、1→0程度)であれば高い確率で検出できる。
* **オーバーヘッドが小さい**
* データ長に対してビット長+1ビットの追加で済むため、伝送効率への影響が小さい。
### デメリット
* **多重ビット誤り(複数ビット同時反転)を検出できない場合がある**
* たとえば 2 ビットが同時に誤って反転した場合(偶数個のビット反転)、偶数パリティでは「誤りなし」と誤検出される可能性がある。
* 4 ビット、6 ビットなど偶数個のビット誤りも検出できない。
* **エラー訂正機能を持たない**
* 検出はできても訂正はできないため、誤りが発生したら再送要求など別の仕組みが必要。
* **検出率は高くない**
* 単一ビットの誤り検出には有効だが、データ損傷率が高い通信回線では誤りの見落としリスクが高まる(より厳密な検査が求められる場面では CRC(巡回冗長検査)や CRC を含む強力なエラー検出コード、あるいは Reed–Solomon コード、LDPC コード、ターボコードなどが用いられる)。
—
## 6. 拡張パリティチェック(2 次元パリティ など)
単一パリティチェックでは誤りの検出能力が限定的なため、より確実に誤りを検出・場合によっては訂正する方法として「2 次元パリティ」「ブロックパリティ」などの拡張が考えられます。
### 6.1 2 次元(行列)パリティ
* **基本アイデア**
データを例えば「8 行 × 8 列」のように行列状に配置し、各行ごとにパリティビット(行パリティ)を付与すると同時に、各列ごとにもパリティビット(列パリティ)を付与します。
* **仕組み**
1. まず送信データを 8×8 のビット行列に区切る。
2. 各行ごとに行パリティ(行を通して“1 の数”が偶数または奇数になるように1ビット追加)。
3. 各列ごとに列パリティ(列を通して“1 の数”が偶数または奇数になるように1ビット追加)。
4. 最後に、行パリティビットをまとめた「1 列分」のパリティ列と、列パリティビットをまとめた「1 行分」のパリティ行ができる。全体として 9×9 のマトリクスを送信するイメージ。
* **メリット**
* 単一ビット誤りだけでなく、2 ビット誤りや、場合によっては誤り位置を特定して訂正(単一ビット訂正)が行える。
* 例:ある行・ある列をチェックして、行パリティと列パリティの両方で不一致になった交点のビットが誤りと判断できる。
* **デメリット**
* オーバーヘッドが格段に増える(8×8データに対し、17×17行列を送信するようなイメージ)。
* 実装がやや複雑になり、伝送効率が下がる。
> **補足**:
>
> * 2次元パリティは「行と列の基本的なパリティ」を組み合わせただけのシンプルな拡張ですが、実際の記憶装置(RAIDやメモリ保護機能)ではさらに高度なパリティ分散やチェックサムを用いることが多いです。
—
## 7. 実際の利用例と比較対象
### 7.1 シリアル通信プロトコル
* **RS-232C(シリアルポート)**
* 典型的には「スタートビット(1ビット)+データビット(7~8ビット)+パリティビット(0 または 1 ビット)+ストップビット(1~2ビット)」というフォーマットでデータを送ります。
* 受信側は「スタートビット以降 データ8ビット+パリティビット」の“1の数”を計算し、奇数/偶数パリティに合致しない場合はそのバイトを破棄し、再送を要求するといった動きをします。
### 7.2 メモリのエラ検出/訂正
* **ECCメモリ**
* サーバー向けメモリでは、多重ビット誤りの検出・訂正を行う「ハミングコード(Hamming Code)」や「SECDED(Single Error Correct, Double Error Detect)」などを用い、パリティビットを複数使った高度な仕組みになっています。
* ただし、「単一パリティビットのみ」を搭載したメモリも存在し、小規模・低コストを重視する組み込み系機器や一部の個人用PCなどで採用されます。
### 7.3 ネットワーク通信(MAC 層など)
* **Ethernet フレーム**
* 原則として CRC(32ビットの巡回冗長検査)を使っており、パリティチェックではない。これは誤り検出精度を高めるためです。
* ただし、より簡易な無線プロトコルやシリアルリンク(RS-422、RS-485 など)ではパリティビットがまだ利用されることがあります。
—
## 8. まとめ
1. **パリティチェックの概要**
* 送信側でデータビット群に追加の1ビット(パリティビット)を付け、受信側で「1 のビット数の偶奇」を検査してビット誤りを検出する方式。
2. **種類**
* 偶数パリティ (Even Parity)
* 奇数パリティ (Odd Parity)
3. **メリット・デメリット**
* メリット:実装が容易、オーバーヘッドが低い、単一ビット誤りを検出可能。
* デメリット:複数ビット誤りを検出できない場合がある、エラー訂正機能は持たない。
4. **拡張例**
* 2次元パリティ(行/列パリティ)などで誤り検出能力を強化し、場合によっては訂正も可能。
5. **応用分野**
* シリアル通信(RS-232C など)、メモリのパリティ保護、産業用/組み込み無線など。
—
### 参考イメージ(ビット列例)
“`
〔送信前データ(8ビット)〕 1 0 1 1 0 1 0 0 (“1” の数 = 4 → 偶数)
├── 偶数パリティ採用の場合 → パリティビット = 0
└→ 送信ビット列 = 1 0 1 1 0 1 0 0 0 (合計 9 ビット)
受信側で再計算→ (1+0+1+1+0+1+0+0) = 4 → 偶数 → 付加ビット 0 と一致 → エラーなし
“`
—
パリティチェックは非常にシンプルながら、古典的な通信回線や組み込み機器では今なおよく使われる基本技術です。用途や信頼性要求に応じて「単一パリティ」だけで済む場合もあれば、より強力な誤り検出/訂正コード(CRC、ハミングコード、LDPCなど)が必要になる場合もあります。まずは「パリティビットをつけて偶数/奇数をチェックする」という考え方を押さえておくと、データ通信やメモリ保護の基礎理解がスムーズになります。
アローダイアグラム ダミー作業
アローダイアグラム ダミー作業とはなんですか?
アローダイアグラムにおける「ダミー作業(ダミーアクティビティ)」とは、以下のような特徴と目的を持つ仮想的な作業です。
1. ダミー作業の定義
ダミー作業 は、所要時間や実際のリソースが一切発生しない「仮想的な作業」です。
ネットワーク上では、矢印(→) で表されますが、その矢印には「0日」などの工数・期間は設定されません。
2. ダミー作業を使う目的
依存関係の論理を正しく表現するため
複数の作業が入り組んだ前後関係を持つとき、矢印だけでは適切に表せないケースがあります。
たとえば、
作業Aと作業Bが両方とも先行してから、作業Cと作業Dが着手する
しかし「作業C は A と B の両方を終えてから着手し、作業D は B のみを終えれば着手できる」
といった場面では、依存関係を矢印だけで示すと線が交差したり、正確な判別が難しくなります。
そこでダミー作業を挟むことで、「A→B→C/D」という複雑な関係を明確に、かつ重複なく表現できます。
矢印の交差や二重関係を回避するため
必要な依存を示しつつ、ネットワーク図上での矢印の重なり・交差を減らし、見やすく整理する役割を果たします。
3. ダミー作業の主な特徴
期間=0、コスト=0
実際に行うタスクではなく、「論理的なつなぎ役」なので、着手日も完了日も発生しません。
矢印は破線で表すことが多い
実際の作業と区別できるよう、図示上は破線(──┄──)で描かれる場合が一般的です。
依存関係のみを示す
作業の順序制約(FS、SS、FF など)を成立させるためだけに挿入します。
4. 図上での表現例
css
コピーする
編集する
A
────── C
│
ダミー│
▼
B ───── D
上記はあくまでイメージですが、
「A→C」は、A が終わって初めて C を始められる
「B→D」は、B が終わって初めて D を始められる
しかし実際には、C は “A と B” の両方を終えたら着手、という条件であるため、A と B の間に「ダミー作業」を入れることで、
A の完了 ➞ ダミー ➞ B という仮の流れを作り、
ダミーが終了(=AとBが完了)した後に C が着手できる、という論理にします。
イメージすると:
css
コピーする
編集する
A ───── ダミー ─────
C
B ───────── D
“A–ダミー–C” の流れで、C の前に「A と B が必ず終わる」という制約をつける
“B→D” はそのまま実線で表して、D は B のみを先行条件とする
5. 具体的な挿入手順
まずはすべての実作業を矢印でつなぐ
主要な先行条件を実線の矢印(実作業)で描く。
依存関係を整理して“二重矢印”や“交差”がないか確認する
必要な論理(何が終わったら何を始められるか)を洗い出す。
実線だけでは表現できない依存関係があれば、ダミー作業を挿入する
実線での前後関係が重複したり食い違い、交差するときに、
どの作業が先行しているべきかを明確にするための“橋渡し”として破線の矢印(ダミー)を入れる。
ダミー作業には必ず「0期間」であることを忘れずに設定
リソースもコストも不要なので、期日管理上も影響しません。
まとめ
ダミー作業 = 時間・コストを伴わない“仮想的な作業”
用いるのは、複数の作業間で入り組んだ依存関係を正しく表すため
図上は破線で示し、期間はゼロ
このように、アローダイアグラムで論理的な順序をきちんと維持しつつ、視覚的に見やすいネットワークを構築するためにダミー作業を使います。
ダミー作業に続く後行程は、ダミー作業の前の工程が終わらないと始められないということですね?
はい。そのとおりです。ダミー作業自体は所要時間ゼロですが、ダミー作業を「前提」とする後続作業は、そのダミー作業が完了しないと着手できません。そしてダミー作業が完了するのは、「ダミー作業の前の工程(実際の作業)」が終わったときです。つまり、
実際の前工程が終了 →
期間ゼロのダミー作業が完了 →
その後に続く後行程が着手可能
という流れになり、後行程は前工程の完了を必ず待つことになります。