【非同期】非同期に関する用語

■ はじめに

非同期に関する用語について、まとめる

目次

【1】排他制御の仕組み
 1)セマフォ(semaphore)
 2)ラッチ(Latch)
 3)ミューテックス (mutex)

【2】その他
 1)シグナル(Signal)
 2)クリティカル セクション (critical section)
 3)アトミック (Atomic)

【1】排他制御の仕組み

 1)セマフォ(semaphore)

Semaphore = 手旗信号、(特に鉄道の)信号機
 => プロセス間で交換される信号

 * 排他アクセスとする必要がない資源を、
 同時にアクセスできるプログラム数を制限する
 
* 以下のサイトの
 「一度に一本の列車しか走れない単線の鉄道線路」が
 イメージしやすいかも

https://docs.oracle.com/cd/E19455-01/806-2732/6jbu8v6os/index.html

 特徴

 * 処理の同時実行数を制限する事ができる
 * セマフォ・カウントの 1 つが解放されるまで動作が保留

 使いどころ

 * スレッドの数を制限したい場合に使用する
 (例えば、TomcatでMaxThreadを超えさせないために使用とか?)

http://www.weblio.jp/content/%E3%82%BB%E3%83%9E%E3%83%95%E3%82%A9
http://itpro.nikkeibp.co.jp/article/Keyword/20070207/261251/

2)ラッチ(Latch)

Latch = 掛け金、かんぬき => プロセス間で交換される信号

 * 「0(オフ/未使用)」または「1(オン/使用中)」の2状態で保持
  => スイッチのようにON/OFFを切り替える

# 非同期よりも、DBロック機構や電子回路で使用されている用語な感じ

 使いどころ

 * 非同期で待ち合わせる処理

 => 例えば、「2つのサービスに接続済みである必要があり、サービスへの接続を待機する場合」
 => スレッドを待機させることができる
 => 特定の条件が満たされるまですべてのスレッドを保留し、
  その条件が満たされると、すべてのスレッドを同時に解放

3)ミューテックス (mutex)

MUTual EXclusion (相互排他) の省略形

 * 『ラッチ(Latch)』『バイナリセマフォ(0,1のセマフォ)』と(ほぼ?)同じ

【2】その他

1)シグナル(Signal)

 * プロセス間で連絡を取り合うための仕組み

 シグナルの具体的な動作

[1] プロセスの実行中に処理を割り込ませたい場合、
 カーネルがシグナルを発生。

[2] シグナルが発生すると実行中のプロセスが中断され、
 特定の処理(シグナル・ハンドラと呼ぶ)が実行

# イベントドリブンに似てるな~...

 同期シグナル

 * プログラム(プロセス)自身の動作によって発生するシグナル

 非同期シグナル

 * 外的な要因で発生するシグナル

 イベント同期

 * 何かのイベントが発生したときに、シグナル・非シグナル状態を切り替え同期する

 参考文献
http://itpro.nikkeibp.co.jp/article/Keyword/20070308/264009/

 2)クリティカル セクション (critical section)

 * 複数スレッドが共有する資源(共有資源:shared resourse)に
 アクセスし、取り合う局面

 * または、あるタスクの実行を、割込みによって、
 同時に一つのスレッドにしか実行させない仕組み

 * Javaの場合、synchronized で実装
 ~~~~~
   synchronized (ロックオブジェクト){
     // クリティカルセクションコード
   }
 ~~~~~

クリティカルセクションに入る

 * スレッドがクリティカルセクションを実行すること

クリティカルセクションを出る

 * クリティカルセクションの実行を終えること

 参考文献
http://miqn.net/rtos/53.html
http://e-words.jp/w/%E3%82%AF%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AB%E3%83%AB%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3.html

 3)アトミック (Atomic)

 * Atomic = 原子(ここでは「これ以上分割できない」という意味)
 * 分割不可能な操作