本文へスキップ

平成21年度 春期 ITパスポート試験 問82

この問題の解説と、これまでの解答の記録です。

問82
頻出度★☆☆

データ D を更新する二つの処理 A,B が,①→③→②→④ のタイミングで実行された場合,D の値は幾らになるか。ここで,D の初期値は 2 とする。

処理A 〔処理内容〕処理B 〔処理内容〕
① D を読み込み,3倍する。③ D を読み込み,5を加える。
② ①の結果を,D に書き込む。④ ③の結果を,D に書き込む。
出典 平成21年度 春期 ITパスポート試験 問82
解説

問 82

  • 不正解ア

    6 は①の計算結果 (2×3) を②で書き込んだ直後の値だが、その後に④で処理B が 7 を上書きするため最終値としては残らない。6 が答えになるのは ①→③→④→② の順、つまり処理B の書き込みが先で処理A の書き込みが後になる場合であり、本問の ①→③→②→④ とは順序が異なる。

  • イ

    正解 正解は イ (7)。読み込み (参照) と書き込み (更新) を分けて、①→③→②→④ の順に D の値と各処理が手元に持つ計算結果を追跡する。初期値は D=2。① 処理A が D を読み込み 2×3=6 を計算するが、この時点ではまだ書き込んでいないので D は 2 のまま。③ 処理B が D を読み込む。②の書き込みがまだ済んでいないため、処理B が読むのは古い値 2 であり、2+5=7 を計算する。② 処理A が①の結果 6 を D に書き込み、D=6 になる。④ 処理B が③の結果 7 を D に書き込み、D=6 を上書きして D=7 となる。最後に書き込んだ処理B の値が残るため答えは 7。ここで処理A の更新 (6) は処理B に上書きされて消えており、これが排他制御を行わなかったときに起こる「更新の消失 (ロストアップデート)」である。

  • 不正解ウ

    11 は処理A が完全に終わってから処理B が読み込んだ場合、すなわち ①→②→③→④ の順に直列実行したときの値 ((2×3)+5=11) である。本問では③が②より先に実行されるため、処理B が読むのは更新後の 6 ではなく初期値 2 であり、11 にはならない。排他制御が正しく働いた理想の結果と取り違えないこと。

  • 不正解エ

    21 は処理B が先に完了してから処理A が読み込んだ場合、すなわち ③→④→①→② の順に直列実行したときの値 ((2+5)×3=21) である。本問では①が最初なので処理A が読むのは 2 であり、7 を 3倍する場面は生じない。

ここがポイント
  • 排他制御 (ロック) をかけずに複数の処理が同じデータを同時に更新すると、両方が更新前の古い値を読み込み、後から書き込んだ側が先の更新を上書きしてしまう。これを「更新の消失 (ロストアップデート)」といい、防ぐには一方が読み込んでから書き込み終えるまでデータをロックし、他方を待たせる必要がある。
  • この形式の問題は、読み込み (その瞬間のデータの値を取得) と書き込み (自分が計算して手元に持っている結果をデータへ反映) を厳密に区別し、指定されたタイミング順に沿って「データの値」と「各処理が保持する値」を表にして 1 ステップずつ追うと確実に解ける。
用語

解答の記録