概要
プロセスとスレッドの違いについてまとめる
プロセスとは
- プログラムの実行単位
- CPU上で実行される
- リソースの共有はできない
- 専用のメモリ領域を使用
- 仮想アドレス空間を保持している
- プロセスの切り替えには仮想アドレスと物理アドレスのマッピング必要
プロセスの保持するデータ構造
プロセスがメモリに保持しているデータ構造は2つのセグメントに分かれている。
テキストセグメント
データセグメント
- PDA(Processor Data Area)
- プロセッサの情報やプロセス管理用のデータなど
- スタックポインタやプログラムカウンタなどが格納される
- スタックポインタ
- プログラムの実行時にCPU内部レジスタ(CPU内部にあるデータの記憶場所)だけでは不足した際に、メインメモリにデータを一時置くことがある
- そのような一時的な置き場所をスタックと呼び、一時的に情報を置く番地を保持しているのがスタックポインタ
- プログラムカウンタ
- データ領域
- 静的領域
- 定数やグローバル変数が置かれる
- ヒープ領域
- 通常の変数などが置かれる
- プロセスが動的に領域を増減させるため、実行時までサイズが分からない
- スタック領域
- 引数やローカルスコープのデータなどが一時期に置かれる
スレッドとは
- 1プロセスから生成される実行単位
- リソースの共有ができる
- 共有のメモリ領域を利用
並列実行時のプロセスとスレッドの違い
プログラムを並列に実行した時のプロセスとスレッドの違い
プロセス
- 親プロセスをforkして子プロセスを複数立ち上げることで並列にプログラムを動かすことができる
- 子プロセス立ち上げの際は、子プロセス用のメモリ領域が割り当てられる
- 割り当てられたメモリ領域には、親プロセスのデータセグメントがコピーされ、子プロセス専用のデータセグメントが確保される
- プログラムの命令自体は親プロセスと同じため、テキストセグメントは親プロセスと同じ領域を参照する
- 子プロセスはあくまで1プロセスなので他のプロセスのメモリに直接アクセスすることはできない
スレッド
- プロセスからスレッドを生成することで並列にプログラムを動かすことができる
- スレッド生成時に親プロセスの仮想アドレス空間内に以下の値をコピーする
- スタック領域
- スタックポインタ
- プログラムカウンタ
- 上記以外のデータは親プロセスと同じものを共有する
- スレッドはプログラムのどの部分を実行しているかというデータだけを持つ
- スレッドが使おうとする変数が別のスレッドによって変更が加えられる可能性ある
- このような状況で動作しても問題が発生しないプログラムをスレッドセーフという
パフォーマンス
プロセス
スレッド
- スレッドの切り替え
- スタック領域、スタックポインタ、プログラムカウンタの切り替えだけ
余談
スタック
- OSやコンパイラが自動的に割り当て・開放を行う
- プログラムのコンパイル、リンクをする際にサイズが決まる
ヒープ
- メモリを必要とした際に確保、不要になった際に解放するという処理をアプリケーションが行う必要がある
- メモリを確保する際に動的にサイズを指定することが可能
参考