前回の続き。
この4章で取り扱うのは「プロセススケジューラ」についてです。
この章で大事なのは以下のとおり。
- 同時に何個のプロセスが実行していても、ある瞬間に論理CPU上で動作できるプロセスは1つだけ
- 論理CPU上では、複数プロセスが、プロセスを順番に1ずつ動かして、1周したらまた一番目のプロセスから動かすラウンドロビン方式で動作している
- 各プロセスはおおよそ等しい長さのタイムスライスを持つ
- プロセス終了までの経過時間は、プロセス数に比例して増加
- 1つのCPU上で同時に処理するプロセスは1つだけ
- 複数プロセスが実行可能な場合、個々のプロセスを適当な長さの時間ごと(タイムスライス)にCPU上で順番に処理する
- マルチコアCPU環境では、複数プロセスを同時に動かさないとスループットが上がらない
- 単一論理CPUの場合と同様に、プロセス数を論理CPU数より多くしてもスループットは上がらない
実験プログラムを書いてVPS上で試したり、書籍に載っているグラフを見てなんとなく理解した気になっているが、 まだ自分の中に落とし込めていないように思う。
とりあえずわからなくても先に進むのが良いので、2周目読むときに復習兼ねて記事にまとめよう。
ノート
第4章 プロセススケジューラ
- マルチコアCPUは、Linuxからは、1つのコアが1つのCPUとして認識される
- プロセスは、ロードバランサ機能によって、システムの負荷に応じて複数の論理CPUをまたいで実行することがある
- tasksetコマンド
- コマンドライン引数で指定したプログラムを、「-c」オプションによってい指定した論理CPU上でのみ動作させる
- 各プロセスは論理CPUを使っている間だけ処理が進捗し、論理CPU上でもう一方のプロセスが動作している間は進捗しない
- 単位時間あたりの進捗は、プロセス数=1のおよそ半分。プロセス数=1の場合は1ミリ秒ごとに1%程度、プロセス数=2の場合は1ミリ秒ごとに0.5%程度
- 処理完了までの経過時間は、プロセス数=1の場合のおよそ2倍
- 同時に何個のプロセスが実行していようとも、ある瞬間に論理CPU上で動作できるプロセスは1つだけ
- 論理CPU上では、複数プロセスが、プロセスを順番に1ずつ動かして、1周したらまた一番目のプロセスから動かすラウンドロビン方式で動作している
- 各プロセスはおおよそ等しい長さのタイムスライスを持つ
- プロセス終了までの経過時間は、プロセス数に比例して増加
- コンテキストスイッチ
- 論理CPU上で動作するプロセスが切り替わること
Linuxにおいて、必ずしも、foo()直後にbar()を実行するという保証はない void foo(void) { ... foo() bar() ... }
プロセスの状態 | 意味 |
---|---|
実行状態 | 現在論理CPUを使っている |
実行待ち状態 | CPU時間が割り当てられるのを待っている |
スリープ | 何らかのイベントが発生するのを待っている。イベント発生までのCPU時間は使わない |
ゾンビ状態 | プロセスが終了した後に親プロセスが終了状態を受け取るのを待っている |
- プロセスは生存中に、実行状態、実行可能状態、スリープ状態という複数の状態を行き来する
- アイドルプロセス
- 何もしない特殊なプロセス
- 新たにプロセスが生成されるか、スリープしているプロセスが希少するまで無駄なループをする
- CPUの特殊な命令を用いて論理CPUを休止状態にし、1つ以上のプロセスが実行可能状態になるまで消費電力を抑えた状態にする
- 論理CPU上で一度に実行できるプロセスは1つだけ
- スリープ状態においてはCPU時間を使わない
スループットとレイテンシ
- スループット: 単位時間あたりの総仕事量。高いほど良い
- レイテンシ: それぞれの処理の開始から終了までの経過時間。短いほど良い。
- プロセスが動作中。実行待ちプロセスがないので、理想的な状態。ただしこの状態で次のプロセスが実行可能状態になると、2つのプロエスのレイテンシが両方とも長くなる
- プロセスが動作中。実行待ちプロセスもあり。スループットは高いが、レイテンシが長くなる傾向にある
- 経過時間: プロセスが開始してから終了するまでの経過時間。
- 使用時間: プロセスが実際に論理CPUを使用した時間
- 1つのCPU上で同時に処理するプロセスは1つだけ
- 複数プロセスが実行可能な場合、個々のプロセスを適当な長さの時間ごとにCPU上で順番に処理する
- マルチコアCPU環境では、複数プロセスを同時に動かさないとスループットが上がらない
- 単一論理CPUの場合と同様に、プロセス数を論理CPU数より多くしてもスループットは上がらない