参考
ByteByteGoのYoutube Process vs Thread
Process
プログラムがメモリ上にロードされ、プロセッサ(CPU)によって実行されてプロセスとなる。プロセスにはレジスタ、プログラムカウンタ、スタックポインタ、メモリページなど必要なリソースがOSによって割り当てられる。
各プロセスは独立したメモリ空間を持っていて、他のプロセスのメモリ空間に影響を与えない。
つまり、あるプロセスが異常を起こしても他のプロセスに影響しない。
この特性を活かしている有名な例はChrome。Chromeは各タブごとにプロセスを生成しているので、あるタブがバグや悪意ある攻撃を受けても他のタブは動作し続けられる。
Thread
スレッドはプロセス内で実行可能な単位。プロセスは少なくとも1つのスレッド(メインスレッド)を持っている。スレッド同士は、同じメモリアドレス空間を共有している。便利だが、あるスレッドが予期せぬ動きをしたらプロセス全体が落ちてしまう可能性もある。
共有するのはヒープ領域のみ、スタック領域はスレッド毎に割り当てられる
スタック領域とヒープ領域
スタック領域
関数呼び出し、局所変数、戻りアドレスなどプログラム実行に関連する情報を保存するための領域。スタック領域はOSによって管理され、関数が終了すると、その関数の領域が自動的に解放される。スタック領域のサイズは比較的小さく大きなデータを格納することはできない。
ヒープ領域
動的にメモリを割り当てる必要があるときに使われる。プログラム実行時に要素が決まる配列やマップなどのデータ構造を格納するなど。ヒープ領域は自由にアクセスできるメモリブロックであり、データの追加や削除が柔軟。一方、一般的にはスタック領域よりも遅い。ヒープ領域は手動で管理する必要があり、メモリの割り当てと解放をプログラマーが制御しなければならない(今はGCがある言語が多いけど)。これを怠るとメモリーリークが起こる。
コンテキストスイッチ
複数のプロセスやスレッドを切り替えるときの仕組みをコンテキストスイッチ(Context Switching)という。
コンテキストスイッチの流れ
あるプロセスを実行している最中に処理を中断してCPU内部のレジスタの状態などを特定のメモリ領域に確保。同じように処理中断されていたプロセスの実行状態をロードして処理再開。
コンテキストスイッチはレジスタの状態の保存・読み込み、メモリページの切り替えが発生するため負荷の高い処理。一般にスレッドのコンテキストスイッチの方がプロセスのコンテキストスイッチより高速。これはスレッドがメモリアドレス空間(ヒープ領域)を共有しているため、特にコストの高い仮想メモリページのスイッチが不要であるため。