階層型スケジュールについて
定義
スケジュールの役割と、そのエントリの子がどのように処理されるかに関する情報(パケット処理、クラス キューなど)をスケジュール エントリにどのように格納するかを理解していることを前提としています(スケジュールの章の「定義」を参照)。ここでは、その議論を基にしていきます。
ここで示した内容と前の章の根本的な違いは、子スケジュールにあり、キューまたは別のスケジュールである可能性があります。階層型スケジューリングにより、複数のレイヤで帯域幅を共有し、複雑な構造を構築できます。
次の図は、基本的な階層型スケジューリング構造を示しています。
図から最初に気付くことは、キューの階層ではなく、スケジュールの階層を実装していることです。これは、キューが階層のリーフ レイヤのみに存在し、 パケット処理(パケット表記ビークル)がキューからキューに移動することはないことを意味します。代わりに、1 つのパケット処理が親スケジュール エントリ(パケットが送信を待機していることを前提とした場合)にロードされます。
スケジューリング階層を詳述する場合、スケジュールを親または子(または実際には孫)として記述します。これらの記述は相対的なものです。親スケジュールは、階層のルートに一段近い(インタフェースに近い)スケジュールです。 スケジュールの子は、スケジュールまたはキューのいずれかになります。スケジュールをリーフ スケジュールまたは非リーフ スケジュールと呼ぶこともあります。 リーフ スケジュール には、子としてのキューのみがあります。非リーフ スケジュールには、子供として少なくとも 1 つのスケジュールがあります。
図を見ると、親スケジュール(非リーフ)のスケジュール エントリには、スケジュール エントリごとに 2 つのパラメータしかしかないことがわかります。最小帯域幅パラメータはリーフ スケジュールでのみサポートされ、非リーフ スケジュールではサポートされません。
スケジューリングの決定:ルートからリーフへ
次の一連の図は、階層内のスケジュールがどのように協調して機能し、さらにインターフェイスを介して送信する次のパケットを選択する際にローカルな決定を下すかを示しています。
ローカルに格納されているパケットの中で、親スケジュールはまず、インターフェイスに転送する最も適格なパケットを選択します。関連付けられたパケット処理を送信した後、独自のスケジュール エントリに空きスポットが生成されます。そのエントリの子からのパケット処理は存在しません。
子が別のスケジュールである場合、親は pop(「最も適格なパケットを選び、そのパケット処理を私に送ってください」と伝えるメッセージ)を送信します。 子スケジュールは、各エントリの設定を確認し、次に送信するパケットを決定し、そのパケット処理を親スケジュールに転送します。これで子には、そのスケジュール エントリのフリー スポットが生成されます。子がキューであるため、決定は必要ありません。キューの先頭にあるパケット処理は、(子)スケジュール エントリにロードされます。
優先度の伝搬の概念
これまでの説明では、帯域幅キューのみを扱っており、やや単純でありました。実際には、各子では、親スケジュールがプライオリティ(キュー) パケットの処理 および帯域幅(キュー)パケットの処理を保持できます(この機能をレーンの通過と呼ぶ)。パケットの処理が子スケジュールから親に送信されると、それがプライオリティ クラスまたは帯域幅クラスのどちらから発生したのかを示し、さらに優先度レベルも示します(この動作を優先度の伝播と呼ぶ)。
優先度の伝播については、この章の後半で説明します。ここでは、階層的なスケジューリングのルールを理解する上で概念のみを紹介します。
この階層では、プライオリティ サービスは親スケジュール エントリの設定を必要としません。(親)スケジュール エントリには、最大ウェイトと超過ウェイトの 2 つのパラメータしかありません。