Linuxカーネル | CPUおよびプロセス管理
プロセスとは
プロセスとは、CPUで実行するためにメモリへロードされたプログラムである。
プロセス確認コマンド
実行中のプロセスは次のコマンドで確認できる。
$ ps aux
出力にはユーザー名、プロセスID、CPU使用率、メモリ使用率、仮想メモリサイズ、実メモリサイズ、端末、プロセス状態、開始時刻、累積CPU時間、実行コマンドなどが含まれる。
メモリ上のプロセス構造
プロセスはメモリのアドレス空間にセグメントごとに配置される。

テキストセグメントにはCPUが実行する機械語命令、データセグメントには初期化済みのstatic変数やグローバル変数、bssセグメントには未初期化のstatic変数やグローバル変数、ヒープには実行時に動的確保される領域、スタックにはローカル変数や関数引数などが配置される。
プロセスとスレッドの違い
1つのプロセスには1つ以上のスレッドがある。プロセスはプログラムの実行単位であり、スレッドはCPUを使用する単位である。子プロセスは新しいメモリ領域を確保するが、子スレッドはスタックセグメントを除いて親スレッドとメモリを共有する。
並列処理
プロセスやスレッドは、複数CPU、マルチコア、ハイパースレッディング、マルチスレッドによって並列処理できる。

CPU確認
使用しているCPUはlscpuまたはcat /proc/cpuinfoで確認できる。
$ lscpu
プロセス管理
プロセス管理とは、いつどのプロセスにCPUを割り当てるかを管理することである。1つのプロセスがCPUを独占すると他の処理ができないため、一定時間ごとにCPUで処理するプロセスを切り替える。
プロセス管理には、プロセス状態遷移、PCB(Process Control Block)、プロセススケジューラが使われる。
プロセス状態遷移
プロセスのライフサイクルには、開始、実行可能、実行中、待機、終了などの状態がある。

PCB
状態を含むプロセス情報はPCBとしてメモリ上で管理される。PCBにはプロセスID、状態、親プロセスポインタ、優先度、プログラムカウンタ、CPUレジスタ、I/O情報、会計情報などが含まれる。

CPUスケジューラ
CPUスケジューラは、実行可能状態のプロセスの中からCPUを割り当てるプロセスを決定する。ディスパッチャは割り込みによりプリエンプションとディスパッチを行い、プロセスを切り替える。この中断と再開の処理をコンテキストスイッチという。