さて、前回は、プロセス管理の基礎編第2回ということで、プロセス間通信やメモリ割り当てについて理解しました。
今回は、スケジューラについて理解していきたいと思います。
スケジューラ
まずは、スケジューラとは?という点から理解していきます。
スケジューラとは、有限のプロセッサ時間を複数のプロセスに分配するカーネルシステムで、プロセッサを最大限に活用し、複数のプロセスが途切れることなく同時に動作しているように見せるため、どのプロセスをいつ実行するかを決定する処理を担当します。
複数のプロセスのスケジュールを管理するという機能ですね。
概念的なところを理解できたので、続いて詳細について整理していきます。
タイムスライスとランキュー
まずは、タイムスライスについてです。
タイムスライスとは、実行可能プロセスが実行のために与えられる時間のことです。
実行可能プロセスとして、タイムスライスが与えられたプロセスはランキューという配列によって管理されます。ランキューの実態は、CPUごとに持っている変数です。
で、各プロセスはプロセスタイムスライスを使い切ると、ランキューから削除されます。
タイムスライスは、以前は100ミリ秒と固定値だったが、現在ではプロセス数に応じて可変になるような実装をしています。
コーポレイティブとプリエンティブ
マルチタスクの実現のアイディアとして、コーポレイティブとプリエンティブという2種類あります。
プリエンティブは、タイムスライスをプロセスごとに与えて、タイムスライスを使い切ったら問答無用で中断することでマルチタスクを実現します。
コーポレイティブは、実行の中断をプロセス自身が自発的に行う方式です。
コーポレイティブ方式では、長時間プロセスがCPUを占有してしまうという問題があるため、現在ではプリエンティブがほぼ全て。
歴史とアイディアを感じますね。
プロセスの種類
ここでは、プロセスの種類について整理してみます。まずは、I/Oバウンドなプロセス プロセッサバウンドなプロセスという分類の仕方から確認します。
I/Oバウンドなプロセス プロセッサバウンドなプロセス
I/Oバウンドなプロセスとは、キーボード操作を待つ、マウスの移動を待つなど、プロセスの実行の完了よりも、多くの時間をIO操作の完了待ちに費やすようなプロセスです。
一方、プロセッサバウンドなプロセスとは、画像処理とか多くのCPU時間を必要とするような処理です。プロセッサバウンドなプロセスでは、タイムスライスを使い尽くします。
I/Oバウンドなプロセスとプロセッサバウンドなプロセスでは、スケジューラの最適な動作が異なります。
プロセッサバウンドなプロセスでは、可能な限り長いタイムスライスが必要ですが、I/Oバウンドなプロセスはタイムスライスを使い切ることなく待ちが発生するからです。
対話型、バッチ、リアルタイムプロセス
別の分類としては、対話型、バッチ、リアルタイムプロセスという分類もできます。
対話型プロセスの例は、テキストエディタやコマンドシェルです。入力があった時にプロセスをすぐに起床させる必要があります。
バッチプロセスの例としては、コンパイラです。ユーザとの対話や応答性が必要ではないので、優先度が下げられることもあります。
リアルタイムプロセスの例としては、ビデオやサウンドのアプリケーション、ロボット制御などです。短い応答時間を保証し、応答のばらつきも最低限にする必要があります。また、優先度が低いプロセスに妨害されてもいかんです。
活動プロセスと時間切れプロセス
では、対話型、バッチ、リアルタイムプロセスを整理したところで、最後に
- 活動プロセス(active process)
- 時間切れプロセス(expired process)
の2つについて理解します。
活動プロセス(active process)
活動プロセス(active process)は、タイムスライスを使い切っていない、実行を許されているプロセスです。
時間切れプロセス(expired process)
タイムスライスを使い切っているプロセス。すべての活動プロセスがexpiredになるまで、実行することができない。
挙動
さて、活動プロセスと時間切れプロセスについて整理しましたが、この観点を持った上で対話型、バッチ、リアルタイムプロセスがどのようにスケジュールされているかを確認します。
バッチプロセスは、タイムスライスを使い切ると、必ずexpired processに移行します。
しかし、他の対話型、リアルタイムプロセスは違います。
対話型プロセスが、タイムスライスを使い切ってもスケジューラが時間を補充して、活動状態のままです。
ただし、いつもいつも補充されて活動状態のままというわけではありません。
expired processに移行したプロセスが長い時間経っている場合や、他のプロセスの優先度が高い場合では、expired processにしてしまうこともあります。
うまくできてるっすねぇ。。
まとめ
今回は、プロセススケジューラについて整理してみました。
並行処理を理解したいなと思って始めたプロセスについての調べ物ですが、気づけば詳解 Linuxカーネルを買うてました。Amazonのレビューを見るとこの1000ページもある本でもLinuxの入り口に過ぎないとあり、痺れますね。
もうしばらくは、Linuxの仕組みで遊べそうです。
僕から以上。あったかくして寝ろよー