2台のPCから一つのファイルを並行して更新した。ファイル中の同一データ(データ1)に対する処理が①~④の順に行われたとき,データ1はどの値になるか。ここで,データ1の初期値は5であった。
| PC−A 【処理内容】 | PC−B 【処理内容】 |
|---|---|
| ① データ1を読み込み,10を足す。 | ② データ1を読み込み,1を引く。 |
| ③ ①の結果を,データ1に書き込む。 | ④ ②の結果を,データ1に書き込む。 |
この問題の解説と、これまでの解答の記録です。
2台のPCから一つのファイルを並行して更新した。ファイル中の同一データ(データ1)に対する処理が①~④の順に行われたとき,データ1はどの値になるか。ここで,データ1の初期値は5であった。
| PC−A 【処理内容】 | PC−B 【処理内容】 |
|---|---|
| ① データ1を読み込み,10を足す。 | ② データ1を読み込み,1を引く。 |
| ③ ①の結果を,データ1に書き込む。 | ④ ②の結果を,データ1に書き込む。 |
正解 ①〜④ の順に、各処理が「いつ読み、いつ書いたか」を追えば答えが出る。初期値は 5。①で PC−A がデータ1を読み込むが、この時点のファイルの値は 5 なので、A は手元で 5+10=15 を計算する。②で PC−B がデータ1を読み込むが、③の書き込みはまだ行われていないためファイルの値は依然 5 で、B は手元で 5−1=4 を計算する。③で PC−A が①の結果 15 をファイルに書き込み、データ1は 15 になる。④で PC−B が②の結果 4 を書き込むため、直前の 15 は上書きされて消え、データ1は最終的に 4 となる。ここで起きているのは、排他制御を行わずに同一データを並行更新したときに、先に反映された更新(+10)が後からの書き込みで失われる「更新の消失(ロストアップデート)」である。よって正解は ア(4)。
5 は更新前の初期値そのもの。③と④で実際にファイルへの書き込みが行われているので、値が初期値のまま残ることはない。また +10 と −1 は打ち消し合わないため、二つの更新が相殺されて 5 に戻るという読み方も成り立たない。
14 は 5+10−1 であり、PC−A と PC−B 双方の更新が正しく反映された「本来あるべき値」。これは排他制御(ロック)が効いて②が③の書き込み後に読み込む場合の結果であって、本問の順序 ①→②→③→④ では②が読むのは書き込み前の 5 なので、B の計算結果は 14 ではなく 4 になる。
15 は③で PC−A が書き込んだ直後の値だが、最後の④で PC−B が自分の計算結果 4 を書き込むため、15 は上書きされて残らない。問われているのは ④ まで終えた最終的な値である点に注意する。