プロセス、スレッドとは

前にも、こんな記事を書いた気がするがまた調べたのでメモ。

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に関する操作システムコールがある
        →ライトウェイトプロセス+カーネルスレッド=ネイティブスレッドと呼ぶこともある