プロセスとスレッドについて学ぼう
2024年1月4日
プログラム
プロセスを理解するためには、プログラムとは何かを知っておく必要があります。
プログラムとは、進行手順や順序を明示した文書であり、コンピューターではハードディスク内に保存されています。
プロセス
プロセスは実行中のプログラムのことで、ディスクからメモリにロードされてCPUの割り当てを受けることができます。
プロセスはプログラムの実行に必要なデータやメモリなどの資源、そしてスレッドで構成されています。
プロセスが割り当てられるOSリソースの例
- CPU時間
- CPU時間はプロセスが実際にCPUを使用する時間を意味します。CPU時間は大きくユーザーCPU時間とカーネルCPU時間に分けられます。
- ユーザーCPU時間: ユーザーモードで実行される時間
- カーネルCPU時間: カーネルモードで実行される時間
- カーネル: オペレーティングシステムの核心部分で、ハードウェアとアプリケーションをつなぐ役割を果たす。
- CPU時間はプロセスが実際にCPUを使用する時間を意味します。CPU時間は大きくユーザーCPU時間とカーネルCPU時間に分けられます。
- メモリ
- Code: プログラムコードが保存される領域
- 実行されるコードそのものを指します。ここでコードとは、プログラマーが書いたコードではなく、コンパイラーが機械語に翻訳したコードを意味します。
- Data: グローバル変数が保存される領域
- グローバル変数はプログラム全体で使用される変数を意味します。グローバル変数はプログラムのデータ領域に保存されます。
- Stack: ローカル変数が保存される領域
- ローカル変数は関数内で宣言され、関数が呼び出されたときに生成され、関数が終了すると消滅する変数を意味します。ローカル変数はスタック領域に保存されます。
- Heap: 動的割り当て変数が保存される領域 ユーザーが直接管理できる変数を意味します。動的割り当て変数はヒープ領域に保存されます。
- Code: プログラムコードが保存される領域
- ファイルおよびI/Oデバイス
- プロセスは実行中に必要なデータをメモリにロードし、実行結果をメモリからファイルやI/Oデバイスに書き込むことがあります。
プロセス間のメモリ共有
- プロセスはそれぞれ独立したメモリ領域を割り当てられ使用します。そのため、プロセスは他のプロセスのメモリに直接アクセスすることはできません。
- したがって、プロセス間では適切な通信方法を使用する必要があります。
プロセス間の通信方法
- パイプ
- パイプは、一方のプロセスが他のプロセスからデータを受け取ることを可能にします。パイプは一方向の通信のみ可能です。
- メッセージキュー
- メッセージキューは、データをメッセージ単位でやり取りできるようにします。メッセージキューは双方向の通信が可能です。
- 共有メモリ
- 共有メモリは、2つのプロセスが共にアクセス可能なメモリを使用する方法です。共有メモリは2つのプロセスが同時にアクセスできるため、同期の問題が発生することがあります。
- ソケット
- ソケットはネットワークを通じてデータのやり取りを可能にします。ソケットは双方向の通信が可能です。
- シグナル
- シグナルはプロセスにどのイベントが発生したかを通知します。プロセスはシグナルを受け取るとそのイベントを処理します。
- ファイル
- ファイルはハードディスクに保存されたデータを読み書きできるようにします。ファイルは双方向の通信が可能です。
プロセスの状態
プロセスは状態が変わりながら実行されます。プロセスは次のような状態を持ちます。
- 実行状態
- プロセスがCPUを占有して命令を実行している状態です。
- 準備状態
- プロセスがCPUを使用していませんが、他のプロセスがCPUを使用していて、いつでも実行できる状態です。
- 待機状態
- プロセスがCPUを使用せず、入出力などのイベントを待っている状態です。
- 生成状態
- プロセスが生成されメモリを割り当てられた状態です。
- 終了状態
- プロセスの実行が完了しメモリが解放された状態です。
スレッド
スレッドはプロセス内で実行される複数の流れの単位です。スレッドはプロセスが割り当てられたリソースを利用して実際に作業を行う主体です。
スレッドの特徴
- プロセス内でそれぞれスタックのみを別々に割り当て、コード、データ、ヒープ領域は共有します。
- プロセス内でそれぞれ独自のPCとSPを持っています。
- プロセス内でそれぞれ独自のレジスタセットを持っています。
スレッドの利点
- システムリソースの消費が減少します。
- スレッドはプロセス内のリソースを共有するため、プロセスを生成してリソースを割り当てるシステムコールが減ります。
- スレッド間の通信が簡単です。
- スレッドはプロセス内のリソースを共有するため、通信が簡単です。
- スレッドのコンテキストスイッチが速いです。
- スレッドはスタックのみを別々に割り当て、コード、データ、ヒープ領域を共有するため、コンテキストスイッチが速いです。
- スレッドの生成が速いです。
- スレッドはプロセス内のリソースを共有するため、プロセスを生成するよりもスレッドを生成する方が速いです。
- スレッドの終了が速いです。
- スレッドはプロセス内のリソースを共有するため、プロセスを終了するよりもスレッドを終了する方が速いです。
- スレッドの同期が簡単です。
- スレッドはプロセス内のリソースを共有するため、同期が簡単です。
エピローグ
- 面接で中々思い出せず、うまく答えられなかったことを残念に思い、この投稿を残す。
- 次は失敗しないようにしよう