なっとく!並行処理プログラミング
from 2025/01/24 冬休みに読む本
なっとく!並行処理プログラミング
t6o_o6t.icon
2025/02/10
セマフォ
セマフォは、一定数の駐車スペースがある公共駐車場に比喩されている。
とても良い表現だと思う。
ミューテックスはバイナリセマフォと等価である。
セマフォという言葉はダイクストラが作った。
2025/02/12
select()を使ってReactorと呼ばれるパターンを実装できる。
リアクターに、コールバック登録を行う。
リアクターは、select()などの同期型イベントデマルチプレクサを使ってイベントの発生を待つ。また、イベントハンドラを呼び出す。
同期という言葉が、このコンポーネントに付いているという事実に注意する。
select()は同期的に動作するのだが、I/Oそのものはノンブロッキングモードで行われている。
I/Oがノンブロッキングモードだからこそ、select()は複数のI/Oイベントを並行して管理できるのである。
この事実に注意すれば、同期/非同期とブロッキング/ノンブロッキングが異なるレイヤーを指す概念ということもわかる。
次のように解釈した。
ブロッキング/ノンブロッキング
(関数やシステムコールといった、I/Oを抽象化した存在に対して)I/Oが完了するまで制御を戻さないか。戻すか。
非同期/同期
複数のタスクを並行的に実行するか、しないか。
2025/02/13
イベントループに対する理解
select()などのI/Oを同期的に待つ存在と、イベントループがどのようにリンクしているのかを理解した。
イベントループをrun_forever()すると、readyなタスクは順に実行されていく。
ここでの実行とは、明示的な停止ポイントの地点まで。
最終的にreadyなタスクがなくなったとき、イベントを同期的に待つ。
これにより、イベントの発生を待っていたタスクがready状態になる。
ready状態になったタスクがどれなのかは、select()の戻り値を介して調べる
Futureの周辺は、読む前より理解が深まったとは言い難い
ふつうのアプリケーション実装には困らないくらいにはPromiseは使ってきたので、まあ良いかとも思うt6o_o6t.icon
サンプルコードにfuture.coroutine(...)という呼び出しがあるのだが、このメソッドの実装が見当たらない...
並行処理の設計に対する基本的な理解
Foster's Methodology
英語で検索するとそれなりに検索結果がヒットするのだが..
日本語で「Fosterの方法論」と検索しても関係のない結果がヒットする。
検索ワードが良くない?
次のような流れだと理解した。
タスクやデータを分解する。
各タスクの通信方法を設計する。
通信には、共有メモリやパイプといったIPCによる手法も考えられる。
通信などが効率的になるようタスクを凝集化させる(→ 並行性は低下)。
各ワーカーにどのようにタスクをスケジューリングするのか、などを考慮する。
実装する。
Map/Reduceを使用した、これまでより大きな規模のサンプルを提示してくれたのが良かった。
分散処理の設計に対する具体的なイメージを持つことができた。
まとめ
本書は、他の書籍に比べ、平易な言葉で、幅広いトピックが語られていると感じた。t6o_o6t.icon
また、他の「なっとく」シリーズと同様、豊富な図で視覚的に理解を進めることができる。
サンプルコードが豊富なのが個人的に良かった。t6o_o6t.icon
文章だけでは理解しがたい概念も、サンプルコードで仕組みの簡易的な実装が示されているので分かりやすい。
並行処理に関心を持った学生や、これから並行処理の実装に取り組む開発者には有用な本である。