起床
I/Oやタイマーの完了でタスクが実行可能になると、runqueueへ追加されます。
実行可能なタスクをCPUへ割り当てる
LinuxのCPUスケジューラは、次に実行するタスクを選び、必要に応じて実行を中断し、複数のCPUへ処理を配置します。
Linuxカーネルは、プロセスプロセス実行中のプログラムを管理する単位。とプロセス内の各スレッドをタスクタスクLinuxカーネルがCPUへ割り当てる実行単位。として管理します。CPUスケジューラが直接選ぶ単位は、このタスクです。
CPUで動ける状態のタスクは実行可能実行可能CPUが空けば実行できる状態。です。各logical CPUのrunqueuerunqueue実行可能なタスクをCPUごとに管理する構造。で管理されます。ファイルやネットワークの応答を待つタスクは、イベントが届いて起床するとrunqueueへ戻ります。
複数のタスクが実行可能なら、スケジューラが選んだタスクだけがCPUを使います。CPUが複数ある場合は、各CPUで選択しながら、runqueue間の負荷も調整します。
I/Oやタイマーの完了でタスクが実行可能になると、runqueueへ追加されます。
スケジューラコアはクラスの優先関係を確認し、選ばれたクラスの規則で次のタスクを決めます。
タスクの待機、プリエンプションプリエンプション実行中のタスクを中断し、別のタスクへCPUを渡すこと。、時間配分の条件、yieldなどを契機に、別のタスクを選びます。
コンテキストスイッチコンテキストスイッチCPUで実行するタスクを入れ替える処理。でCPUレジスタなどを保存し、次のタスクの状態を復元します。
Linuxは用途ごとに異なるスケジューリングクラスを持ちます。スケジューラコアはクラス間の優先関係を扱い、各クラスが自分の候補から次のタスクを選びます。
runtime、deadline、periodを指定し、時間制約と帯域を管理します。
固定優先度を基準に選びます。SCHED_RRは同じ優先度のタスクへ時間を配分します。
通常のアプリやサーバープロセスを扱います。公平なCPU配分と応答性を調整します。
通常のタスクを選ぶ仕組みは、候補数の増加、対話的な処理の応答性、複数CPUでの拡張性に対応してきました。現在のEEVDFは、公平さの計算と要求された時間配分から仮想デッドラインを求めます。
選択対象になったタスクから、仮想デッドラインが最も早いものを選びます。
図では次のタスクを選ぶ考え方に絞っています。実装は優先度、CPU構成、省電力なども扱います。
CPUレジスタなどを保存し、次のタスクの状態を読み込みます。
優先度を反映したCPU使用量です。CFSとEEVDFが計算に使います。
選択対象と仮想デッドラインを使い、待ち時間と公平さを調整します。