プロセスとスレッドの違いや、並行処理・並列処理についてまとめてみました!
プロセスとスレッド
プロセス
実行中のプログラムのインスタンスを指す。マルチプロセスは複数プロセスが同時に実行されることを指し、それぞれのプロセスは独立したプロセスと動作しており、メモリでデータを共有しない。例えば、Microsoft WordやExcelはそれぞれが独立したプロセスとしてシステム上で動作する。
メモリアドレス空間
プロセスがアクセスできる仮想メモリの範囲のこと。プロセスごとに独自の空間があるため、他プロセスと競合しない。また仮想メモリを使用しており、物理メモリの実際の位置に関係なく、連続したメモリ空間を持っているかのように動作することができる。
ヒープメモリ
動的メモリ割り当て(Javaでいうところのnewで生成するインスタンス)に使用される。プロセス配下のスレッドはヒープメモリのデータを共有する。
ファイルディスクリプタ
OSによってが割り当てられるオープンされたファイルやリソースへの参照で、一般に整数値で表され、ファイルやソケット・その他のI/Oリソースを扱う際の識別子となる。
スレッド
プロセス内で実行される最小の単位を指す。プロセス内では複数のスレッドが同時に実行されており同一プロセス(アプリ)にて複数タスクを同時に実行することができる。例えばMicrosoft Word では、あるスレッドはユーザーの入力監視、別スレッドはドキュメントの保存、さらに別スレッドは画面更新、といったように異なる処理を担当するスレッドが複数同時に動いている。
レジスタ状態
CPU内のレジスタに格納されているデータで、各スレッドごとに異なる。プログラムの実行に必要な情報(実行中の命令のアドレス・現在の計算結果・スタックポインタ)などが含まれる。レジスタ状態を復元したり保存したりすることでスレッドを再開したり一時停止したりすることができる。
スタックメモリ
スレッド固有のメモリ領域で、関数の呼び出し・ローカル変数の保存・戻り値の管理などに使われる。関数呼び出しごとに新しいスタックフレームが作成され、関数が終了するとそのフレームがスタックから取り除かれる。
プログラムカウンタ
レジスタの一つで、現在実行中または次に実行される命令のアドレスを保持する。
並行処理と並列処理
1つのコアではコンテキストスイッチによりタスクを平行処理しつつ、実際には複数のコアが動作している環境下では並列処理も行われて同時に複数のタスクが実行されている。
並行処理は実際にはタスクを切り替えて行っている。またコンテキストスイッチには別のタスクに切り替えるオーバーヘッドが発生する。そのため、各コアが同時に別の処理を実行することができる並列処理のほうが全体の処理性能を向上する可能性がある。
並行処理:Concurrency
1つのコアが複数のタスクを切り替えながら交互に実行する。
並列処理:Parallelism
複数のコアが複数のタスクを同時に実行する。マルチコアを前提とするためシングルコアでは並列処理は行えない。マルチコアではプロセスのみならず、あるプロセス内の複数スレッドを異なるコアにて処理することができる。
まとめ
プロセスやスレッドの構成要素や違いついて簡単にまとめてみました。OS関連以外にもまとめていこうと思います!