私は「Three Easy Pieces」を読んでオペレーティングシステムについて学んでいますが、完全に公正なスケジューラに関する章で詰まっています。ここ、血。 8-10)。各ジョブのタイムスライスは、利点/重みに基づいて動的に計算され、各ジョブの実行時は(動的にも計算された)vruntimeを介して追跡され、コンテキスト切り替えが発生すると現在のvruntimeが最も低くなります。次のスケジュールでキャッチしよう
私が理解していないのは、OSがコンテキスト切り替えを実行することを決めた場合です。本の一部では、次のように言います。
CFSは周期的なタイマー割り込みを使用するため、一定の間隔でのみ決定できます。この割り込みは頻繁に発生し(たとえば、1ミリ秒ごとに)、CFSでスリープモードを解除し、現在のジョブが実行を終了したかどうかを判断する機会を提供します。
オペレーティングシステムは、ジョブ実行の終了をどのように決定しますか?ジョブの実際の実行時間(予約のため)がそのタイムスライス値に達したときですか?それとも、仮想ランタイムがスケジュールの開始から時間に達するのはいつですか?それとも、OSが頻繁に停止するたびにジョブのvruntimeを更新し、仮想ランタイムが低い他のジョブがあるかどうかを確認しますか?
答え1
オペレーティングシステムは、ジョブ実行の終了をどのように決定しますか?
著者はこの点について非常に直接的です。
オペレーティングシステムは頻繁に中断されるたびにタスクのvruntimeを更新しますか?
はい。しかし、コストのかかるコンテキスト遷移をあまりにも頻繁に回避するために、通常は現在のジョブを実行状態にしておく。
以前は、実行中のn = 4プロセスの例を提供していましたが、sched_latency
48ミリ秒を4で割ると、各max(6、12)に対して12ミリ秒に等しい時間が与えられます。彼らは次のように説明しました。
その後、CFSは最初のジョブをスケジュールし、12ミリ秒の(仮想)ランタイムを使用するまでそれを実行し、実行するvruntimeが低いジョブがあることを確認します。
したがって、12のスケジューラティックは実行中の最初のタスクを見つけ、最後のティックでのみCFSが他のタスクをスケジュールするためにそのタスクを削除します。
ジョブの実際の実行時間(予約のため)がそのタイムスライス値に達したときですか?
実際の実行時間は、1サイクルよりはるかに短い場合があります。たとえば、ジョブが実行を開始してすぐにブロックread()にかかる場合です。これは自発的なプリエンプションと呼ばれ、非同期タイマーがオフになるのではなく、プログラムロジックと同期的に発生します。したがって、読み取りはキューに追加され、それからvruntime
スケジューラは、次に実行する低ジョブを探します。ただし、割り込みが発生すると、現在実行中のジョブが確認され、通常は実行を継続できます。