プロセス、スレッドとは
前にも、こんな記事を書いた気がするがまた調べたのでメモ。
1.1 プロセスとスレッドの違い
・プロセス
・ファイルディスクリプタの情報
・プログラムの実行状況
・CPUの割り振り時間
とかプログラムを実行する上で必要な情報の固まり
・スレッド
・プロセス内の処理の単位
1.2 以下のように捉えると分かりやすい
・(シングルスレッド)普通のプログラムを実行すると
(1)プログラムの実行に必要な情報の固まり(プロセス)が生成される
(2)1つの処理単位である(スレッド)が実行される(必要な情報はプロセスで管理されている)
・上記のように考えれば、マルチスレッドは簡単に捉えられる。
・処理単位を1つ増やすだけである
→あくまでも、処理単位を増やすだけであり、必要な情報の複製等は行っていない
→1つ目のスレッド(プログラム実行時初めに生成される)とメモリの情報は共有される
2.1 2種類の並列処理、マルチプロセスとマルチスレッドの違い
・マルチプロセス
→親プロセスがプログラムの実行に必要な情報をコピーし、1つのスレッドを生成
→メモリ空間がコピーされる(親プロセスとメモリ空間が別)
・マルチスレッド
→1つのプロセスの中で処理単位(スレッド)を1つ増やすだけ
→メモリ空間などは、1個目の処理単位(スレッド)と共有される
2.2 スレッドの種類について
・ユーザスレッド
→ユーザ空間で実装されたスレッド機構
→ユーザがスレッド切り替えをする必要がある
→1プロセスで動いているスレッドは、必ず1つ(マルチコアの恩恵受けられない)
・カーネルスレッド
→カーネル空間で実装されたスレッド機構
→カーネルがスレッドの切り替えをする
→1プロセスで動いているスレッドは複数ある
→プロセス管理の観点から見たら、プロセスとほぼ同じ。コンテキストスイッチ等のプロセス並みのオーバヘッドが生じる
2.3 そこでライトウェイトプロセスが出てくる
・カーネルスレッドはライトウェイトプロセスというユーザスレッド群を管理するプロセスを管理
(1)ユーザスレッド群のスケージュリングは、ユーザ空間で行う
(2)ライトウェイトプロセスは、スケジューリング結果より実行すべきユーザスレッドを実行する
(3)オーバヘッドは、カーネルスレッド>ライトウェイトプロセス>ユーザスレッド
・カーネルスレッドとライトウェイトプロセスは、1対1または、1対0で結びつけられる
→1対0のカーネルスレッドは、カーネルの処理を行うカーネルスレッドである
・ライトウェイトプロセス+カーネルスレッド=ネイティブスレッド
3.1 まとめ
・プロセスをプログラムの実行単位と捉えるよりは、プロセスは1つ以上のスレッドを持っており、スレッドが実行単位と考える方がよい
・ユーザスレッドは、1プロセス内の複数のスレッドを同時(複数コア上)に動かすことはできない
・カーネルスレッドは、1プロセス内の複数のスレッドを同時(複数コア上)に動かすことができる
→ただし、カーネルが管理するスレッド数には、上限がある
→コンテキストスイッチ等のプロセス並みのオーバヘッドが生じる
・ライトウェイトプロセス
→カーネルスレッドは、1つのLWPを管理し、LWPがユーザスレッド群を管理する
→ライトウェイトプロセスを使うと、複数コア上でスレッドを走らせることが可能
→Cライブラリがスレッド構築と同時に、CWPの生成とユーザランドで動くスケジューラ生成してくれる
→LWPの生成、ユーザスレッドと結びつける等のLWPに関する操作システムコールがある
→ライトウェイトプロセス+カーネルスレッド=ネイティブスレッドと呼ぶこともある