排他制御って何?
排他制御とは、共有資源に対して複数のアクセスが同時に発生しても問題なく動作できる制御のことをいいます。
スポンサーリンク
例えば、共有資源である「共有ファイル」を複数の人が同時に変更した場合、排他制御されていれば、以下の図のように、データの整合性が保たれます。
- 共有ファイルに男性と女性が同時にアクセス(共有ファイルの内容は「AAA」)
- 男性は共有ファイルに「BBB」を追加
- 女性は共有ファイルに「CCC」を追加
- 結果、共有ファイルの内容は「AAA」「BBB」「CCC」となりデータの整合性が保たれる
上記と同じケースで排他制御されていない場合、以下の図のようにデータの整合性が保たれない可能性があります。
- 共有ファイルに男性と女性が同時にアクセス(共有ファイルの内容は「AAA」)
- 男性は共有ファイルに「BBB」を追加
- 女性は共有ファイルに「CCC」を追加
- 結果、共有ファイルの内容は、後から更新した方のデータになってしまい「BBB」が反映されず整合性の保たれないデータになる危険性があります。
このような事態を防ぐために、共有ファイルへの書き込みが行われている間は、他の人の書き込みを禁止するという制御を行います。
排他制御ってどうやるの?
排他制御を行う仕組みは「ロック」や「ミューテックス」「セマフォ」などが有名な方式です。
スポンサーリンク
ロック
ロックとは、共有資源にロックをかけて同時にアクセスさせない方式。有名な方式では「悲観ロック」と「楽観ロック」があります。
悲観ロックは「同じデータを他者が頻繁に更新する」という悲観的な考え方の排他制御です。具体的には、更新対象データを取得時にロックして他者が操作できないようにする方式です。またロックする方法には「共有ロック」と「占有ロック」があります。
悲観ロック(悲観的排他制御)とは
続きを見る
楽観ロックとは、そもそも「同時アクセスはあまり起きない」という楽観的な考え方の排他制御。データ自体をロックすることはせず、更新対象のデータが更新前と同じであるかを確認してから更新することで、データの整合性を保つ排他制御です。
楽観ロック(楽観的排他制御)とは
続きを見る
ミューテックス
ミューテックスとは「未使用」と「使用中」で判断し、共有資源を同時にアクセスさせない方式。
例えば、ミューテックスが「未使用」の共有資源にアクセスすると「使用中」に変わります。「使用中」となっている時は、他のプログラム(タスク)がアクセスしようとしても、アクセスできません。
このように共有資源に対して、同時アクセスを防ぐ排他制御のことを「ミューテックス」といいます。
セマフォ
セマフォとは、同時にアクセスできる数を管理し、その人数までしか共有資源に対して同時にアクセスさせない方式。
例えば、セマフォのカウント数が「2」の場合、共有資源には同時に2つのプログラム(タスク)がアクセスが可能です。
共有資源に2つのプログラム(タスク)がアクセスしている場合は、他のプログラム(タスク)がアクセスしようとしても、アクセスできません。(セマフォのカウント数が「1」の場合は、共有資源に同時アクセスできないので基本的にミューテックスと同じ動きになる)
このように共有資源に対して、同時にアクセスできる数を決め、その数以上の同時アクセスを防ぐ排他制御です。