スケジューラー実行キュー

スケジューラーは、ディスパッチ可能になっているすべてのスレッドの実行キューを維持します。

以下の図は、実行キューを象徴化して描いたものです。

図1: 実行キュー。 この図は、小さい優先順位の値を持つスレッドが、 大きい優先順位の値を持つスレッドより先に実行キューを通過することを簡単に示しています。 指定可能な優先順位の値の範囲は 0 から 127 で、この値は合計 128 個の実行キューに直接関連しています。
実行キュー

優先順位を持つディスパッチ可能スレッドはすべて、実行キュー内の位置を占めています。

スケジューラーの基本ディスパッチ可能エンティティーがスレッドです。 AIX® は、256 個の実行キューを維持します。 これらの実行キューは、各スレッドの優先順位フィールドに入れることが可能な値の範囲 (0 から 255) に直接関連しています。 この方式により、どのスレッドを実行するのが最も好都合かをスケジューラーが判断しやすくなります。 スケジューラーは、単一の大きい実行キューを検索する必要はなく、マスクを使用して、 該当する実行キューで実行可能なスレッドの存在を示すビットがオンになっている場所を調べれば済みます。

スレッドの優先順位の値は、迅速かつ頻繁に変化します。 一定の移動は、スケジューラーが優先順位を再計算する方法によるものです。 ただし、固定優先順位スレッドの場合は、これは正しくありません。

AIX バージョン 6.1以降、各プロセッサーにはノードごとに実行キューがあります。 パフォーマンス・ツールに報告される実行キューの値は、各実行キュー内のすべてのスレッドの合計になります。 プロセッサーごとに実行キューを持つと、ロックのディスパッチングにおけるオーバーヘッドが減少し、全体としてのプロセッサーとの親和性が改善されます。 スレッドは、より頻繁に同じプロセッサーにとどまるようになります。 スレッドが、実行可能スレッドが実行されていたプロセッサーとは別のプロセッサー上のイベントのために実行可能になった場合、 使用されていないプロセッサーがあると、このスレッドは直ちにディスパッチされます。 プロセッサーの状態を調べられるようになるまで (例えば、 このスレッドのプロセッサーでの割り込みなど)、優先使用は行われません。

複数の実行キューを持つマルチプロセッサー・システムでは、一時的な優先順位の逆転が起きる ことがあります。 ある時点で、ある実行キューにあるいくつかのスレッドの優先順位が、他の 実行キューのものより高いということがあり得ます。 AIX には、時間の経過とともに優先順位のバランスを取るメカニズムがありますが、厳密な優先順位が必要な場合 (例えば、リアルタイム・アプリケーションの場合) は、 RT_GRQ と呼ばれる環境変数が存在します。 RT_GRQ 環境変数を ON に設定すると、このスレッドはグローバル実行キューに置かれます。 その場合、最高の優先順位を持つスレッドを求めて、グローバル実行キューの検索が行われます。 これによって、割り込み駆動型スレッドのパフォーマンスが改善されることがあります。 schedo コマンドの fixed_pri_global パラメーターが 1 に設定されている場合、固定優先順位で実行されているスレッドは、グローバル実行キューに入れられます。

実行キュー内のスレッドの平均数は、vmstat コマンド出力の最初の列に表示されます。 この数をプロセッサーの数で除算すると、その結果が各プロセッサーで実行されるスレッドの平均数になります。 この値が 1 より大きい場合、これらのスレッドはプロセッサーでの実行の順番を待つ必要があります (数が大きいほど、パフォーマンス遅延が認識されるようになります)。

スレッドが実行キューの終わりに移動されると (例えば、スレッドがタイム・スライスの終わりに制御を得る場合)、そのスレッドは、 同じ優先順位の値を持つキュー内の最後のスレッドの後の位置に移動します。