システムインタフェース

コマンドと関数

図 3-2 は、デフォルトのプロセス優先順位を示しています。

図 3-2 プロセスの優先順位 (プログラマから見た場合)

Graphic

プロセス優先順位が意味を持つのは、スケジューリングクラスについてだけです。プロセス優先順位を指定するには、クラスとクラスに固有の優先順位の値を指定します。クラスとクラスに固有の値は、システムによってグローバル優先順位に割り当てられ、この値を使用してプロセスがスケジューリングされます。

優先順位は、システム管理者から見た場合と、ユーザやプログラマから見た場合とは異なります。スケジューリングクラスを設定する場合、管理者はグローバル優先順位を直接取り扱います。システムでは、ユーザが指定した優先順位は、このグローバル優先順位に割り当てられます。優先順位の詳細は、『Solaris のシステム管理 (第 1 巻)』を参照してください。

-cel オプションを指定した ps(1) コマンドは、有効なすべてのプロセスのグローバル優先順位を報告します。priocntl(1) コマンドは、ユーザとプログラマが使用するクラス固有の優先順位を報告します。

priocntl(1) コマンド、priocntl(2) 関数、および priocntlset(2) 関数は、プロセスのスケジューリングパラメタを設定または検索します。優先順位を設定する場合の基本的な方法はどれも同じで、次のようになります。

以上の ID は UNIX のプロセスの基本的な特性です (詳細は、Intro(2) を参照してください)。クラス ID は、プロセスのスケジューリングクラスです。priocntl(2) は、タイムシェアリングクラスと実時間クラスだけに有効で、システムクラスには使用できません。

priocntl(1) コマンド

priocntl(1) ユーティリティは、プロセスをスケジューリングする際に、次の 4 つの制御機能を実行します。

priocntl -l

設定内容が表示される 

priocntl -d

プロセスのスケジューリングパラメタが表示される 

priocntl -s

プロセスのスケジューリングパラメタが設定される 

priocntl -e

指定したスケジューリングパラメタでコマンドが実行される 

以下に、priocntl(1) を使用した例をいくつか示します。

デフォルト設定について -l オプションを使用すると、次のように出力されます。


$ priocntl -d -i all
CONFIGURED CLASSES
==================

SYS (System Class)

TS (Time Sharing)
Configured TS User Priority Range -20 through 20

RT (Real Time)
Maximum Configured RT Priority: 59

すべてのプロセスについての情報を表示する例


$ priocntl -d -i all   

すべてのタイムシェアリングプロセスについての情報を表示する例


$ priocntl -d -i class TS

ユーザ ID が 103 または 6626 のすべてのプロセスについての情報を表示する例


$ priocntl -d -i uid 103 6626

ID 24688 のプロセスに実時間プロセスのデフォルトパラメタを設定する例


$ priocntl -s -c RT -i pid 24668

ID 3608 のプロセスを優先順位 55、タイムスライス 5 分の 1 秒の実時間プロセスとして設定する例


$ priocntl -s -c RT -p 55 -t 1 -r 5 -i pid 3608

すべてのプロセスをタイムシェアリングプロセスに変更する例


$ priocntl -s -c TS -i all

ユーザ ID 1122 のプロセスに対して、タイムシェアリングユーザ優先順位とユーザ優先順位限界を -10 に減少させる例


$ priocntl -s -c TS -p -10 -m -10 -i uid 1122

デフォルトの実時間優先順位で実時間シェルを開始する例


$ priocntl -e -c RT /bin/sh

タイムシェアリングユーザ優先順位を -10 にして make を実行する例


$ priocntl -e -c TS -p -10 make bigprog

priocntl(1) は、nice(1) の機能を包んでいます。nice(1) は、タイムシェアリングプロセスについてだけ有効で、数値が大きいほど優先順位が低くなります。上の例は、「増分」に 10 を指定して nice(1) を実効するのと同じです。


$ nice -10 make bigprog

priocntl(2) 関数

priocntl(2) 関数は、priocntl(1) ユーティリティがプロセスに対して行うのと同様、1 つのプロセスまたは 1 組のプロセスのスケジューリングパラメタを取得または設定します。priocntl(2) 呼び出しは LWP に、1 つのプロセスだけに、またはプロセスのグループに働かせることができます。プロセスのグループは、親プロセス、プロセスグループ、セッション、ユーザ、グループ、クラス、またはアクティブなすべてのプロセスによって識別できます。使用方法については、マニュアルページを参照してください。

priocntl(2) を使用して % priocntl -l と同等のことを行う例が、付録 A 「完全なコーディング例」 にあります。

PC_GETCLINFO コマンドは、クラス ID を与えるとスケジューリングクラス名とパラメタを取得します。このコマンドは、どのクラスが設定されているかについて想定しないプログラムの作成を容易にします。PC_GETCLINFO と一緒に priocntl(2) を使用して、プロセス ID を元にしてプロセスのクラス名を取得する例は、例 A-2 にあります。

PC_SETPARMS コマンドは、1 組のプロセスのスケジューリングクラスとパラメタを設定します。idtypeid の入力引数は、変更するプロセスを指定します。例 A-3 は、PC_SETPARMS コマンドと一緒に priocntl(2) を使用して、タイムシェアリングプロセスを実時間プロセスに変換する例を示しています。

priocntlset(2) 関数

priocntlset(2) 関数は、priocntl(2) と同様に、1 組のプロセスのスケジューリングパラメタを変更します。priocntlset(2) には、priocntl(2) と同じコマンドセットがあり、cmdarg の入力引数は同じです。ただし、priocntl(2) は 1 組の idtypeid のペアだけによって指定される 1 組のプロセスに適用されるのに対し、priocntlset(2) は 2 組の idtypeid のペアを論理的に結合した結果の 1 組のプロセスに適用されます。詳細は、マニュアルページを参照してください。

例 A-4 では、priocntlset(2) を使用して、同じユーザ ID のタイムシェアリングプロセスを実時間プロセスに変更しないで、実時間プロセスの優先順位を変更する例を示します。