「クリティカルセクション」の版間の差分

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

2015年9月22日 (火) 15:51時点における最新版

クリティカルセクション (Critical section, クリティカルリージョン, Critical region) とは、単一のリソースに対して、複数の処理が同時に実行されると破綻する部分をいいます。クリティカルセクション では、排他制御 を行い、アトミック性を確保しなければなりません。

読み方

クリティカルセクション
くりてぃかる せくしょん
Critical section
くりてぃかる せくしょん
クリティカルリージョン
くりてぃかる りーじょん
Critical region
くりてぃかる りーじょん

概要

クリティカルセクション は、1つのプロセス・スレッドのみが実行されなければなりません。 クリティカルセクション の前後では、排他制御のために、ロックの取得と解放を行います。 同時に複数のスレッドがクリティカルセクションに入ろうとしても、排他制御を行うことにより、1つのスレッドのみがクリティカルセクションに入ることを許され、ほかのスレッドは、ロックが解放されるのを待たなければなりません。

クリティカルセクション が存在する処理のとして、「銀行のATMでお金を引き出す」処理が挙げられます。

2つの ATM で、同じ口座から1万円ずつ引き出そうとします。 口座からは、合わせて、2万円を減らさなければなりません。

  1. 残高をデータベースから取得する
  2. 残高から引き出す額を減らす
  3. 残高をデータベースに保存する

上記の処理がアトミック に処理されない場合、どうなるのでしょうか? 2万円、引き出したはずなのに、1万円しか引き出したことにならない、といった現象が発生するでしょう。

カウンタの例

カウンタの流れ

ウェブページ のカウンタのプログラムの例で説明します。

カウンタの処理は、以下の手順は、アトミック に処理されなければなりません。

  1. カウンタの値をファイルから読み出す
  2. カウンタの値を1増やす
  3. カウンタの値を記憶装置に書き込む

排他制御しない場合

二人のユーザーがウェブページ に同時にアクセスします。 カウンタは、2増えなければなりません。 しかしながら、同時にユーザーがアクセスするとどうなるでしょうか。

カウンタの値をファイルから読み出す処理が同時に走ると同じ値を読み出し、そして、1インクリメントした、同じ値を同時に書き込むことになり、結果、2つのアクセスは、1つのアクセスとしてカウントされます。

排他制御を使用する場合

以下の処理は、クリティカルセクションです。複数のアクセスは、排他制御されなければなりません。

  1. カウンタの値をファイルから読み出す
  2. カウンタの値を1増やす
  3. カウンタの値を記憶装置に書き込む

クリティカルセクション に入る前に、排他ロックを行い、排他制御します。クリティカルセクションの終わりでは、ロックを解放します。

  1. 排他ロックを取得する
  2. カウンタの値をファイルから読み出す
  3. カウンタの値を1増やす
  4. カウンタの値を記憶装置に書き込む
  5. 排他ロックを解放する

仮に、複数のユーザーがアクセスしてきたとしても、最初の排他ロックによって、1つのスレッドだけが、クリティカルセクションに入ることを許可されます。 ほかのスレッドは、ロックが解放されるまで、待たされることになります。

関連項目

  • 競合状態
  • スレッド
  • マルチスレッド
  • アトミック
  • 排他制御
  • ロック
  • デッドロック