図 3-2 は、デフォルトのプロセス優先順位を示しています。
プロセス優先順位が意味を持つのは、スケジューリングクラスについてだけです。プロセス優先順位を指定するには、クラスとクラスに固有の優先順位の値を指定します。クラスとクラスに固有の値は、システムによってグローバル優先順位に割り当てられ、この値を使用してプロセスがスケジューリングされます。
優先順位は、システム管理者から見た場合と、ユーザやプログラマから見た場合とは異なります。スケジューリングクラスを設定する場合、管理者はグローバル優先順位を直接取り扱います。システムでは、ユーザが指定した優先順位は、このグローバル優先順位に割り当てられます。優先順位の詳細は、『Solaris のシステム管理 (第 1 巻)』を参照してください。
-cel オプションを指定した ps(1) コマンドは、有効なすべてのプロセスのグローバル優先順位を報告します。priocntl(1) コマンドは、ユーザとプログラマが使用するクラス固有の優先順位を報告します。
priocntl(1) コマンド、priocntl(2) 関数、および priocntlset(2) 関数は、プロセスのスケジューリングパラメタを設定または検索します。優先順位を設定する場合の基本的な方法はどれも同じで、次のようになります。
ターゲットプロセスを指定する。
そのプロセスに希望するスケジューリングパラメタを指定する。
プロセスにパラメタを設定するコマンドまたは関数を実行する。
以上の ID は UNIX のプロセスの基本的な特性です (詳細は、Intro(2) を参照してください)。クラス ID は、プロセスのスケジューリングクラスです。priocntl(2) は、タイムシェアリングクラスと実時間クラスだけに有効で、システムクラスには使用できません。
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(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 組のプロセスのスケジューリングクラスとパラメタを設定します。idtype と id の入力引数は、変更するプロセスを指定します。例 A-3 は、PC_SETPARMS コマンドと一緒に priocntl(2) を使用して、タイムシェアリングプロセスを実時間プロセスに変換する例を示しています。
priocntlset(2) 関数は、priocntl(2) と同様に、1 組のプロセスのスケジューリングパラメタを変更します。priocntlset(2) には、priocntl(2) と同じコマンドセットがあり、cmd と arg の入力引数は同じです。ただし、priocntl(2) は 1 組の idtype と id のペアだけによって指定される 1 組のプロセスに適用されるのに対し、priocntlset(2) は 2 組の idtype と id のペアを論理的に結合した結果の 1 組のプロセスに適用されます。詳細は、マニュアルページを参照してください。
例 A-4 では、priocntlset(2) を使用して、同じユーザ ID のタイムシェアリングプロセスを実時間プロセスに変更しないで、実時間プロセスの優先順位を変更する例を示します。