Solaris のシステム管理 (第 2 巻)

スケジューラの概要

「スケジューラ」(またはディスパッチャー) は、プロセスへの CPU 割り当てを制御するカーネルの一部です。スケジューラは、プロセスを実行するタイミングと実行時間を、それに割り当てられた優先順位に従って決定します。優先順位は、スケジューリングクラスとプロセスの動作に基づきます。デフォルトでは、タイムシェアリング、システム、リアルタイム、対話型という 4 つのスケジューリングクラスがサポートされています。

スケジューラはシステム性能に大きな影響を与えます。


注 -

基本的なスケジューリングエンティティは、カーネルスレッドです。1 つのスレッドからなるプロセスの場合、カーネルスレッドのスケジューリングは、プロセスのスケジューリングと同じです。


SunOS 5.7 のスケジューラは、プロセスの実行順序と、別のプロセスの前に各プロセスが使用できる CPU 時間の量を制御します。

スケジューラは、スケジューリングクラスごとに定義されたスケジューリングポリシーに従って、プロセスに CPU 時間を割り当てます。各スケジューリングクラスには、一連の優先レベルまたは待ち行列が割り当てられています。実行準備ができたプロセスは、これらの待ち行列間を移動します。クラス内では、これらの待ち行列を連続する優先レベルセットと見なすことができます。これらの優先レベルは、グローバルスケジューリング優先順位セットにマップされます。

プロセスのグローバル優先順位によって、いつ実行するかが決まります。スケジューラは、実行準備ができていて最上位のグローバル優先順位を持つプロセスを実行します。優先順位の数値が大きいプロセスが最初に実行され、同じ優先順位を持つプロセスはラウンドロビン方式のスケジューリングポリシーを使用して実行されます。

スケジューラがプロセスを CPU に割り当てると、プロセスは次のいずれかのイベントが発生するまで実行されます。

デフォルトでは、すべてのリアルタイムプロセスは、システムプロセスよりも上位の優先順位を持ち、すべてのシステムプロセスはタイムシェアリングプロセスよりも上位の優先順位を持ちます。

プロセスは、スケジューラクラスやそのクラス内での優先順位など、スケジューラパラメタを親プロセスから継承します。ユーザーが (priocntl コマンドやシステムコールを使用して) 要求した場合にのみ、プロセスはクラスを変更します。システムは、ユーザー要求とプロセスのスケジューリングクラスに関連付けられたポリシーに基づいて、プロセスの優先順位を管理します。

スケジューラの起動

スケジューラの起動により、特定のスケジューリングポリシーを必要とするデータベースやマルチスレッド対応のアプリケーションをサポートするカーネルスケジューリングが可能になります。スケジューラの起動におけるマルチスレッドサポートのための変更は、カーネルと libthread ライブラリ間のプライベートインタフェースとして実装されているため、libthread インタフェースに変更はありません。また、アプリケーションにより、性能を向上するためのスケジューリングに関するヒントがカーネルに提供されることもあります。詳細は、schedctl_init(3X) のマニュアルページを参照してください。