プロセスとスレッド
選び方#
| プロセス | スレッド | |
|---|---|---|
| メモリ | 独立 | 共有 |
| 障害の波及 | しない | プロセス全体が落ちる |
| 通信コスト | 高い(IPC) | ほぼゼロ |
| 生成コスト | 高い | 低い |
| デバッグ | しやすい | 難しい |
隔離を取るか、通信の速さを取るかの選択。
プロセス間通信 (IPC)#
| 手段 | 特徴 |
|---|---|
| パイプ | 単方向、親子間 |
| 名前付きパイプ | 無関係なプロセス間 |
| 共有メモリ | 速いが同期が要る |
| メッセージキュー | 構造化された送受信 |
| ソケット | ネットワーク越しも可 |
| シグナル | 非同期の通知。単純な用途のみ |
軽量スレッド#
OS スレッドは 1 本あたり スタックを 1〜8 MB 予約するため、数万本は現実的でない。
| 実装 | 名称 |
|---|---|
| Go | goroutine(初期スタック 2 KB、伸縮する) |
| Java 21+ | 仮想スレッド |
| Erlang | プロセス(言語レベル、極めて軽い) |
| Rust、Python | async タスク |
いずれもランタイムが多数の軽量スレッドを 少数の OS スレッドに載せる(M:N)。 I/O で待つ間に他へ切り替えることで、 少ないカーネル資源で高い並行度を得る。
プロセス分離の実例#
Chrome はタブごとにプロセスを分ける。 メモリを多く使うが、 1 タブのクラッシュやセキュリティ侵害が 他に波及しない。
信頼できないコードを扱うなら、隔離のコストは正当化される。
参考文献#
- Remzi H. Arpaci-Dusseau, Andrea C. Arpaci-Dusseau. Operating Systems: Three Easy Pieces. Arpaci-Dusseau Books, 2018.(全文公開) https://pages.cs.wisc.edu/~remzi/OSTEP/
- Maurice Herlihy, Nir Shavit. The Art of Multiprocessor Programming, 2nd ed. Morgan Kaufmann, 2020.
- Charles Reis, Steven D. Gribble. Isolating Web Programs in Modern Browser Architectures. EuroSys, 2009. https://doi.org/10.1145/1519065.1519090