スレッド

スレッド

執筆済 コンピュータOS

プロセス内の実行の流れ。 アドレス空間を共有する。

プロセスとの違い#

プロセス スレッド
アドレス空間 独立 共有
スタック 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/
ノート一覧を閉じる