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

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

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

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

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

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

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

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