基礎事項 †
実行形態 †
- コンカレント (concurrent) ... スレッドを切り替えながら処理を実行し、擬似的な並行処理を行う
- パラレル (parallel) ... 複数のCPU(コア)で実際に同時処理を行う
並行処理の目的=処理性能の向上 †
- スループットの向上
- マルチプロセッサの有効活用
- CPUの空き時間の有効活用(I/Oバウンドな処理で多く発生)
- レスポンスの向上
- 複数同時ユーザに対する応答時間
- CPU占有の回避(CPUバウンドな処理で多く発生)
- 迅速かつ定期的なフィードバック
データ共有における問題 †
相互排他・協調モデル †
モニタ †
- 共有リソースに対して処理を行う関数群(モニタ関数)で構成
- モニタ関数は複数のスレッドで同時に実行することはできない
- 全てのスレッドがモニタ関数を通して共有リソースに対する処理を行うことで、リソースに同時にアクセスするスレッドが1つであることが保証され、データの不整合を防ぐことができる
セマフォ (semaphore) †
- 構成要素
- 任意の正の整数値を初期値にとるセマフォ変数
- P操作 ... セマフォ変数がなければ値を -1 に、0の場合は待機(ロック取得)
- V操作 ... セマフォ変数の値を +1(ロック解放)
読み書きロック (read-write lock) †
- 読み込みと書き込みの2つの処理を区別して、処理が読み込みの場合のみ複数のスレッドが同時にロックを取得することを許可する
フューチャー (future) †
- 関数の処理は非同期に行い、後から結果を取得する際には同期で行う
並列処理 †
メッセージパッシング †
- スレッド間でデータを共有するのではなく、複製されたデータをメッセージとして送受信
- メッセージは、単純なバイト列としてのデータから、オブジェクトなどのデータ構造、関数などの処理コードなど、様々な形式が考えられる
- メッセージ仲介のモデル
- 非同期/同期チャネル
- メールボックス
- ワーカースレッド
アクターモデル †
- アクターは独自のメールボックスを持つ
- メッセージはそれぞれのメールボックスに格納される
- アクターは受信したメッセージを1つずつ取り出し、以下の動作を基本にして全体としての処理を実行する
- メッセージに応じた処理を実行
- 他のアクターにメッセージを送信
- 送信元のアクターにメッセージを返す
|