クリティカルセクション
クリティカルセクション (Critical section, クリティカルリージョン, Critical region) とは、単一のリソースに対して、複数の処理が同時に実行されると破綻する部分をいいます。クリティカルセクション では、排他制御 を行い、アトミック性を確保しなければなりません。
読み方
- クリティカルセクション
- くりてぃかる せくしょん
- Critical section
- くりてぃかる せくしょん
- クリティカルリージョン
- くりてぃかる りーじょん
- Critical region
- くりてぃかる りーじょん
概要
クリティカルセクション は、1つのプロセス・スレッドのみが実行されなければなりません。 クリティカルセクション の前後では、排他制御のために、ロックの取得と解放を行います。 同時に複数のスレッドがクリティカルセクションに入ろうとしても、排他制御を行うことにより、1つのスレッドのみがクリティカルセクションに入ることを許され、ほかのスレッドは、ロックが解放されるのを待たなければなりません。
クリティカルセクション が存在する処理のとして、「銀行のATMでお金を引き出す」処理が挙げられます。
2つの ATM で、同じ口座から1万円ずつ引き出そうとします。 口座からは、合わせて、2万円を減らさなければなりません。
- 残高をデータベースから取得する
- 残高から引き出す額を減らす
- 残高をデータベースに保存する
上記の処理がアトミック に処理されない場合、どうなるのでしょうか? 2万円、引き出したはずなのに、1万円しか引き出したことにならない、といった現象が発生するでしょう。
カウンタの例
カウンタの流れ
ウェブページ のカウンタのプログラムの例で説明します。
カウンタの処理は、以下の手順は、アトミック に処理されなければなりません。
- カウンタの値をファイルから読み出す
- カウンタの値を1増やす
- カウンタの値を記憶装置に書き込む
排他制御しない場合
二人のユーザーがウェブページ に同時にアクセスします。 カウンタは、2増えなければなりません。 しかしながら、同時にユーザーがアクセスするとどうなるでしょうか。
カウンタの値をファイルから読み出す処理が同時に走ると同じ値を読み出し、そして、1インクリメントした、同じ値を同時に書き込むことになり、結果、2つのアクセスは、1つのアクセスとしてカウントされます。
排他制御を使用する場合
以下の処理は、クリティカルセクションです。複数のアクセスは、排他制御されなければなりません。
- カウンタの値をファイルから読み出す
- カウンタの値を1増やす
- カウンタの値を記憶装置に書き込む
クリティカルセクション に入る前に、排他ロックを行い、排他制御します。クリティカルセクションの終わりでは、ロックを解放します。
- 排他ロックを取得する
- カウンタの値をファイルから読み出す
- カウンタの値を1増やす
- カウンタの値を記憶装置に書き込む
- 排他ロックを解放する
仮に、複数のユーザーがアクセスしてきたとしても、最初の排他ロックによって、1つのスレッドだけが、クリティカルセクションに入ることを許可されます。 ほかのスレッドは、ロックが解放されるまで、待たされることになります。
関連項目
- 競合状態
- スレッド
- マルチスレッド
- アトミック
- 排他制御
- ロック
- デッドロック
ツイート