排他制御の解説(基本情報技術者シラバス用語)

目次

排他制御とは

排他制御とは、複数のプロセスやスレッドが、ファイルやデータベースなどの共通の資源(共有データ)に対して同時にアクセスした際に、データの不整合(矛盾)が発生しないようにする仕組みです。あるプロセスが共有データを書き換えている間、他のプロセスが যত্নデータを書き換えたり読み込んだりできないように「ロック(鍵)」をかけ、処理が終わったらロックを解除します。これに関連する概念として「セマフォ」などがあります。

具体例

  • ホテルの予約システム:空室が残り1室の状態で、AさんとBさんが同時に「予約する」ボタンを押したとします。排他制御がないと、システムが同時に2人の予約を受け付けてしまい、ダブルブッキングが発生します。排他制御があれば、先に処理が始まったAさんのために一時的にその部屋をロックし、Bさんの処理は「予約失敗」または「待ち状態」にしてデータの矛盾を防ぎます。
  • 共同編集ファイル:共有サーバー上のExcelファイルを編集する際、誰かが開いていると「編集中のため読み取り専用で開きます」と表示され、同時に上書きできないようになるのも排他制御の一種です。

もう少し詳しく

排他制御(Mutual Exclusion)は、マルチタスクやマルチスレッド環境において、複数の処理が「同時にアクセスしてはいけない共有の資源(データ、ファイル、ハードウェアなど)」を取り扱う際に、データの矛盾や破壊を防ぐための極めて重要なメカニズムです。この同時にアクセスしてはならないプログラム上の区間を「クリティカルセクション(危険領域)」と呼びます。例えば、銀行の口座残高が10万円のとき、Aの処理が「5万円引き出す」、Bの処理が「3万円引き出す」という操作を完全に同時に行ったとします。もし排他制御がないと、両方が「現在の残高は10万円」というデータを同時に読み込み、Aは「残高を5万円に上書き」、Bは「残高を7万円に上書き」してしまい、結果として後から書き込んだデータのみが残り、重大なデータの不整合(ロストアップデート問題)が発生してしまいます。

この問題を防ぐために、排他制御では「ロック」という概念を用います。あるプロセスが共有データにアクセスする際、まずそのデータに対して「鍵(ロック)」をかけます。ロックがかかっている間、他のプロセスはデータを読み書きすることができず、ロックが解除されるまで「待機状態(ブロック)」となります。代表的な実装手法として、オランダの計算機科学者ダイクストラが考案した「セマフォ(Semaphore)」という仕組みが広く知られています。セマフォは、利用可能な資源の数を表す変数と、それを増減させる2つの不可分な操作(P操作:資源の取得・待機、V操作:資源の解放)によって、高度で安全な同期制御を実現します。ただし、排他制御を複雑に組み合わせると、複数のプロセスがお互いに相手が持っているロックの解除を待ち合ってしまい、システム全体が永久に停止してしまう「デッドロック」という致命的な障害を引き起こすリスクがあるため、設計には細心の注意が求められます。

試験でのポイント

データベースのトランザクション処理や、OSの並行処理の分野で最重要テーマの一つです。

  • 共有ロックと専有ロック:データベースの排他制御において、データを「読み込む」だけの場合は複数の処理が同時にアクセスしても問題ないため、他の読み込みを許容する「共有ロック」をかけます。一方、データを「書き換える(更新・削除)」場合は、他の処理からの読み込みも書き込みも一切禁止する「専有ロック(排他ロック)」をかける、という使い分けが頻出です。
  • デッドロックの発生条件と対策:プロセスAが資源Xをロックしたまま資源Yを要求し、同時にプロセスBが資源Yをロックしたまま資源Xを要求すると、お互いに身動きが取れなくなります(デッドロック)。これを防ぐためには、「複数の資源を要求する場合は、常に同じ順番(例:必ずX→Yの順)でロックを取得するようにルール化する」といった対策が有効であると問われます。
  • 不可分操作(アトミック操作):ロックをかけるという操作自体が、他の処理から割り込まれない「これ以上分割できない単一の操作(アトミック操作)」としてハードウェアレベルで保証されている必要がある点も重要です。

関連する用語

デッドロック、セマフォ、クリティカルセクション

読んだ内容を10問練習と実技で確認

記事で理解した用語を、StudyQuestの演習とクラウド実技ラボで定着させます。

10問練習 実技ラボ