今回はこちらの書籍「[試して理解]Linuxのしくみ〜実験と図解で学ぶOSとハードウェアの基礎知識」 の4章 プロセススケジューラについて、自己理解のために内容をかいつまんで要約します。素晴らしい書籍で理解が進むと思いますのでぜひご購入を検討ください。
プロセススケジューラとは
1つのCPU(1コア)では一度に1つのプロセスしか動作させることができません。しかし私たちは同時に複数のアプリケーションを同時に立ち上げたいものです。Excelを使いながらYouTubeを見たいですね。
これを実現しているのがプロセススケジューラです。
プロセススケジューラはプロセスがCPUを使うタイミングをコントロールして並行的にプロセスが動作できるようにしています。この図のようにプロセスを切り替えてCPUで動作させることで複数のプロセスの同時実行を可能にしています。(あまりに切り替えが早いので人間には同時に動いているように見えています)
よく間違えがちなのが並列化(Parallel)と並行化(Concurency)は別物になります。こちらの記事で解説をしていますので並行化についておさえておきましょう。
コンテキストスイッチ
CPUを触れるプロセスを切り替えることをコンテキストスイッチと言います。
コンテキストスイッチはプロセスがどんなコードを実行しても実行される点に注意してください。
プロセスの状態
プロセスは大きく分けて以下の分類の状態が存在します。
状態 | 意味 |
---|---|
実行状態 | 現在CPU使用中 |
実行待ち状態 | CPU時間が割り当てられるのを待っている |
スリープ状態 | 何らかのイベント発生待ち。イベントが発生するまでCPU時間は使われない |
ゾンビ状態 | プロセスが終了したあとに親プロセスが終了状態を受け取るのを待っている |
※上記以外にも状態は存在します
[root@master vagrant]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.1 0.1 193672 6668 ? Ss 4月21 1:14 /usr/lib/systemd/systemd - root 2 0.0 0.0 0 0 ? S 4月21 0:00 [kthreadd] root 3 0.2 0.0 0 0 ? S 4月21 2:16 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< 4月21 0:00 [kworker/0:0H]
STAT列にでているSsやSが状態を表しています。
STAT列の1文字目 | 状態 |
---|---|
D | 割り込み不可能なスリープ状態(だいたいIO要求のため) |
S | 割り込み可能なスリープ状態(イベントの完了待ち) |
R | 実行中 または 実行可能状態(runキュー上にいる) |
Z | 親プロセスとの切断されたゾンビ状態 |
プロセスの状態遷移
プロセスは生成されてから終了されるまで以下の図のような状態の遷移を行います。
スループットとレイテンシ
つづいてこちらのキーワードについて紹介します。
- スループット:単位時間あたりの処理量
- レイテンシ:ある処理にかかった時間
レイテンシは文脈によっては遅延を意味することがあるため注意してください。
ここではCPUのアイドル時間(CPUがプロセスの処理を行なっていない時間)とスループット・レイテンシについて話します。CPUのアイドル時間が存在する場合はスループットを向上させる場合があります。というのもCPUが働いていない時間を使って新しくプロセスを動かすことができるので、単位あたりの処理量を増やすことができるからです。
一方でCPUにアイドルがあった場合でもプロセスを増やした場合はコンテキストスイッチが発動する回数が増えるためレイテンシが増加します。
複数のCPUでのスケジューリング
CPUを複数ソケット積んだり、ハイパースレッディング等の技術により複数のコア使うことが当たり前になりました。そのためスケジューラは複数の論理CPUに処理を分散させるためにロードバランサやグローバルスケジューラという機能を持っています。
この機能を使って複数のプロセスに対して平等にCPU時間が分配されるように、各論理CPUに処理を分散しています。
まとめ
この章ではプロセススケジューラについて整理しました。書籍にはより詳しい情報や、基礎的なため今回は端折った内容も豊富に掲載されていますので勉強の際はぜひお買い求めください。