スレッド
プロセス内の実行の流れ。 アドレス空間を共有する。
プロセスとの違い#
| プロセス | スレッド | |
|---|---|---|
| アドレス空間 | 独立 | 共有 |
| スタック | 1 つ | スレッドごと |
| 生成コスト | 大きい | 小さい |
| 切り替え | 重い(TLB フラッシュ) | 軽い |
| 隔離 | 強い | 無い |
| 通信 | IPC が要る | 変数を直接読み書き |
共有が利点であり欠点#
通信が速い代わりに、 同じ変数を同時に触ることによる誤りが起きる ([競合状態](/コンピュータ/並行・並列処理/Race Condition))。
1 つのスレッドがメモリを壊すと、 プロセス全体が落ちる。
実装の種類#
| 種類 | 内容 |
|---|---|
| カーネルスレッド | OS が管理する。真の並列実行が可能 |
| ユーザスレッド | ランタイムが管理する。生成が非常に軽い |
| ハイブリッド (M:N) | 多数のユーザスレッドを少数のカーネルスレッドに載せる |
Go の goroutine、Java の仮想スレッドは M:N 方式。 数万〜数百万のスレッドを扱える。
カーネルスレッドは 1 本あたり スタック 1〜8 MB を確保するため、 数万本は現実的でない。
async/await との関係#
I/O 待ちの間に他の仕事をしたいだけなら、 スレッドを増やすより非同期処理の方が効率がよい。
| スレッド | async | |
|---|---|---|
| 切り替え | OS が行う | ランタイムが行う |
| コスト | 数マイクロ秒 | 数十ナノ秒 |
| 適する対象 | CPU バウンド | I/O バウンド |
| 難しさ | 競合状態 | 関数の色分け問題 |
参考文献#
- Remzi H. Arpaci-Dusseau, Andrea C. Arpaci-Dusseau. Operating Systems: Three Easy Pieces. Arpaci-Dusseau Books, 2018.(全文公開) https://pages.cs.wisc.edu/~remzi/OSTEP/
- Andrew S. Tanenbaum, Herbert Bos. Modern Operating Systems, 4th ed. Pearson, 2014.
- Randal E. Bryant, David R. O’Hallaron. Computer Systems: A Programmer’s Perspective, 3rd ed. Pearson, 2016. https://csapp.cs.cmu.edu/