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

スケジューラクラスのポリシー

この後の各節では、タイムシェアリング、システム、リアルタイムという 3 つのデフォルトクラスのスケジューリングポリシーについて説明します。

タイムシェアリングクラスのポリシー

デフォルト構成では、初期化プロセス (init) はタイムシェアリングクラスに属します。プロセスはスケジューラパラメタを継承するので、すべてのユーザーログインシェルと、各シェルから実行されるプロセスは、タイムシェアリングプロセスとして起動されます。

タイムシェアリングポリシーの目標は、対話型プロセスの応答時間を短縮し、大量の CPU 時間を使用するプロセスのスループットを適正化することです。スケジューラは、各プロセスに関連付けられた優先順位に従って、CPU 時間をプロセス間で適正に分割しようとします。優先順位が上位のプロセスは、下位のプロセスよりも優先して扱われます。しかし、あるジョブ (プロセス) が CPU を独占しないように、スケジューラはジョブを優先順位の上位から下位へ、または下位から上位へ移動できます。

スケジューラは、応答時間を短縮する一方で切り替えによって時間が無駄にならない程度の頻度で CPU 割り当てを切り替えます。通常、タイムスライスは 1/100 秒単位程度です。

タイムシェアリングポリシーは、優先順位を動的に変更し、さまざまな長さのタイムスライスを割り当てます。プロセスが起動されると、そのタイムシェアリング優先順位は、取得する CPU 時間や待ち行列内で費やす時間などの要素に従って変動します。スケジューラは、「休眠状態」になっているプロセスの優先順位を上げます (たとえば、端末の読み取りやディスクの読み取りなどの入出力処理が始まると、プロセスは休眠状態になります)。単純なシェルコマンドの編集や実行などの対話型作業では、頻繁に休眠状態になります。これに対して、タイムシェアリングポリシーは、休眠状態にならずに長期間 CPU を使用するプロセスの優先順位を下げます。

デフォルトのタイムシェアリングポリシーは、優先順位が低いプロセスに大きいタイムスライスを与えます。優先順位の低いプロセスほど CPU 内にたまる傾向があります。他のプロセスが最初に CPU を取得しますが、優先順位の低いプロセスが最終的に CPU を取得するときには大きなタイムスライスを取得します。タイムスライス中に優先順位の高いプロセスの実行準備ができると、実行中のプロセスを横取りします。

スケジューラは、タイムシェアリングパラメタテーブル ts_dptbl 内のパラメタを使用してタイムシェアリングプロセスを管理します。このテーブルには、タイムシェアリングクラスに固有の情報が入っています。このテーブルは、ディレクトリ /kernel/sched 内のロード可能モジュール TS_DPTBL から、コアメモリーに自動的にロードされます。

システムクラスのポリシー

システムクラスは、固定優先順位ポリシーを使用して、サーバーなどのカーネルプロセスや、ページデーモンなどの準備作業プロセスを実行します。それぞれの優先順位は、タイムシェアリングプロセスのように動的に調整されません。システムクラスはカーネル用に予約されており、ユーザーがシステムクラスからプロセスを追加または削除できません。システムクラスのプロセスの優先順位は、カーネルプロセス用のカーネルコード内で設定されます。これらの優先順位は、一度確立された後は変化しません (カーネルモードで実行されるユーザープロセスはシステムクラスではありません)。

リアルタイムクラスのポリシー

SunOS 5.7 オペレーティングシステムは、タイムシェアリングポリシーだけでなくリアルタイムのスケジューリングポリシーを使用します。リアルタイムスケジューリングを使用すると、ユーザーはプロセスごとに固定優先順位を設定できるので、重要なプロセスを事前に決めておいた順序で実行できます。リアルタイムスケジューラは優先順位間でジョブを移動しません。リアルタイム優先順位は、ユーザーが (priocntl コマンドを使用して) 要求したときにのみ変化します。この固定優先順位ポリシーはタイムシェアリングポリシーと同じで、対話型の応答時間を短縮するためにシステムが優先順位を変更します。

リアルタイム優先順位が最上位のユーザープロセスは、他のプロセスの実行準備ができていても、実行できるようになると必ず CPU を取得します。リアルタイムプロセスにとってオペレーティングシステムからの応答時間が保証されるようなアプリケーションを作成できます。


注 -

リアルタイムプロセスの実行準備ができていると、プロセスやタイムシェアリングプロセスは実行されません。他のリアルタイムプロセスは、優先順位が上位の場合にのみ実行できます。リアルタイムプロセスを慎重に管理しないと、タイムシェアリングプロセスの性能に重大な悪影響を及ぼすことがあります。


リアルタイムポリシーは、デフォルトでは優先順位が高いプロセスに小さいタイムスライスを割り当てます。優先順位が高いプロセスは、外部イベントによって駆動されるリアルタイムプロセスに割り当てられます。オペレーティングシステムは、入出力に瞬間的に応答できなければなりません。優先順位の低いリアルタイムプロセスとは、より長い処理時間を必要とするプロセスです。優先順位の最も高いプロセスがタイムスライスを使い果たすと、そのプロセスを横取りできるような優先順位のより高いプロセスは存在しないので再び実行されます。

スケジューラは、リアルタイムパラメタテーブル rt_dptbl 内のパラメタを使用してリアルタイムプロセスを管理します。このテーブルには、リアルタイムクラスに固有の情報が入っています。このテーブルは、ディレクトリ /kernel/sched 内のロード可能モジュール RT_DPTBL から、コアメモリーに自動的にロードされます。