Manpages

名 前

getpriority, setpriority − プ ロ グ ラ ム の ス ケ ジ ュ ー リ ン グ の 優 先 度 を 取 得 /設 定 す る

書 式

#include <sys/time.h>
#include <sys/resource.h>

int getpriority(int which, id_t who);
int setpriority(int
which, id_t who, int prio);

説 明

シ ス テ ム コ ー ル getpriority() や setpriority() は 、 whichwho で 指 定 さ れ た プ ロ セ ス 、 プ ロ セ ス グ ル ー プ 、 ユ ー ザ ー の ス ケ ジ ュ ー リ ン グ 優 先 度 (scheduling priority) の 取 得 や 設 定 を そ れ ぞ れ 行 う 。

which の 値 は PRIO_PROCESS, PRIO_PGRP, PRIO_USER, の ど れ か 一 つ で 、 whowhich に 応 じ て 解 釈 さ れ る (PRIO_PROCESS だ と プ ロ セ ス 識 別 子 、 PRIO_PGRP だ と プ ロ セ ス グ ル ー プ 識 別 子 、 PRIO_USER だ と UID (ユ ー ザ ー ID) と 解 釈 さ れ る )。 who が ゼ ロ な ら ば 、 (そ れ ぞ れ )呼 び 出 し た プ ロ セ ス 、 呼 び 出 し た プ ロ セ ス の プ ロ セ ス グ ル ー プ 、 呼 び 出 し た プ ロ セ ス の 実 UID を 意 味 す る 。 prio は −20 か ら 19 の 範 囲 の 値 で (但 し 以 下 の 注 意 の 項 を 参 照 の こ と )、 デ フ ォ ル ト の 優 先 度 は 0 で あ る ; 小 さ な 数 字 ほ ど 、 有 利 な ス ケ ジ ュ ー リ ン グ と な る 。

getpriority() コ ー ル は 指 定 し た プ ロ セ ス の 中 の 最 も 高 い 優 先 度 (数 値 的 に は 最 小 の 値 ) を 返 す 。 setpriority() コ ー ル は 指 定 し た プ ロ セ ス 全 て の 優 先 度 を 指 定 し た 値 に 設 定 す る 。 優 先 度 を 今 よ り 小 さ い 値 に 設 定 で き る の は ス ー パ ー ユ ー ザ ー だ け で あ る 。

返 り 値

getpriority() は 成 功 し た 場 合 に も −1 の 値 を 返 す 可 能 性 が あ る の で 、 呼 び 出 し の 前 に 外 部 変 数 の errno を ク リ ア し 、 呼 び 出 し の 後 に 返 り 値 の −1 が 正 当 な 値 か エ ラ ー か を 判 別 す る 必 要 が あ る 。 setpriority() コ ー ル は エ ラ ー が な け れ ば 0 を 返 し 、 エ ラ ー が あ れ ば −1 を 返 す 。

エ ラ ー

EINVAL

whichPRIO_PROCESS, PRIO_PGRP, PRIO_USER の い ず れ で も な い 。

ESRCH

whichwho で 指 定 さ れ た プ ロ セ ス が 存 在 し な い 。

上 記 の も の に 加 え て setpriority() で は 以 下 の エ ラ ー が あ る :

EACCES 呼 び 出 し 元 が プ ロ セ ス の 優 先 度 を 下 げ よ う と し た が 、 必 要 な 特 権 を 持 っ て い な か っ た

(Linux の 場 合 、 CAP_SYS_NICE ケ ー パ ビ リ テ ィ が な か っ た )。 Linux 2.6.12 以 降 で は 、 呼 び 出 し 元 が 、 あ る プ ロ セ ス の 優 先 度 を 、 変 更 対 象 の プ ロ セ ス の リ ソ ー ス RLIMIT_NICE の ソ フ ト リ ミ ッ ト の 範 囲 外 に 設 定 し よ う と し た 場 合 に の み 、 こ の エ ラ ー が 発 生 す る 。 詳 細 は getrlimit(2) を 参 照 。

EPERM プ ロ セ ス は 見 つ か っ た が 、 そ の プ ロ セ ス の 実 効

(effective) UID が 呼

び 出 し 元 の 実 効 UID に も 実 (real) UID に も 一 致 せ ず 、 呼 び 出 し 元 が 特 権 も 持 っ て い な か っ た (Linux の 場 合 、 CAP_SYS_NICE ケ ー パ ビ リ テ ィ が な か っ た )。 以 下 の 「 注 意 」 も 参 照 の こ と 。

準 拠

SVr4, 4.4BSD (こ れ ら の 関 数 は 4.2BSD で 最 初 に 登 場 し た ), POSIX.1−2001.

注 意

fork(2) で 作 成 さ れ た 子 プ ロ セ ス は 、 親 プ ロ セ ス の nice 値 を 継 承 す る 。 execve(2) の 前 後 で nice 値 は 保 存 さ れ る 。 相 対 的 な nice 値 の 違 い が プ ロ セ ス 間 の ス ケ ジ ュ ー リ ン グ に ど の 程 度 影 響 を 与 え る か は 、 UNIX シ ス テ ム 間 で 異 な り 、 Linux で は カ ー ネ ル バ ー ジ ョ ン に よ り 異 な る 。 Linux は 、 カ ー ネ ル 2.6.23 以 降 で 、 nice 値 の 相 対 的 な 違 い が 、 非 常 に 強 い 影 響 を 与 え る ア ル ゴ リ ズ ム を 採 用 し た 。 こ の ア ル ゴ リ ズ ム で は 、 他 に 優 先 度 の 高 い も の が シ ス テ ム に 存 在 す る 時 に は 、 非 常 に 低 い nice 値 (+19) で は プ ロ セ ス に 本 当 に ほ と ん ど CPU が 割 り 当 て ら れ な い 。 ま た 、 高 い nice 値 (−20) で は CPU を 必 要 と す る ア プ リ ケ ー シ ョ ン (例 え ば オ ー デ ィ オ ア プ リ ケ ー シ ョ ン ) に CPU の ほ と ん ど が 割 り 当 て ら れ る 。

EPERM が 発 生 す る 条 件 の 詳 細 は シ ス テ ム に 依 存 す る 。 上 記 の 説 明 は POSIX.1−2001 の も の で あ り 、 全 て の System V 風 シ ス テ ム は こ れ に 従 っ て い る よ う で あ る 。 2.6.12 よ り 前 の Linux カ ー ネ ル で は 、 呼 び 出 し 元 の 実 UID ま た は 実 効 UID が プ ロ セ ス who の (実 効 UID で な く ) 実 UID に 一 致 す る 必 要 が あ る 。 Linux 2.6.12 以 降 で は 、 呼 び 出 し 元 の 実 行 UID が プ ロ セ ス who の 実 UID か 実 効 UID の い ず れ か と 一 致 す る 必 要 が あ る 。 全 て の BSD 風 シ ス テ ム (SunOS 4.1.3, Ultrix 4.2, 4.3BSD, FreeBSD 4.3, OpenBSD−2.5等 ) は 、 Linux 2.6.12 以 降 と 同 じ 動 作 を す る 。 実 際 の 優 先 度 の 範 囲 は カ ー ネ ル の バ ー ジ ョ ン に よ り 異 な る 。 バ ー ジ ョ ン 1.3.36 よ り 前 の Linux で は −infinity(マ イ ナ ス 無 限 大 )..15 で あ る 。 カ ー ネ ル 1.3.43 以 降 の Linux で は 、 −20..19 で あ る 。 他 の い く つ か の シ ス テ ム で は 、 こ の 範 囲 が −20..20 で あ る 。 現 在 で は <sys/time.h> を イ ン ク ル ー ド す る 必 要 は な い が 、 イ ン ク ル ー ド す れ ば 移 植 性 を 高 め る こ と が で き る (実 際 に は <sys/resource.h>rusage 構 造 体 が 定 義 さ れ て い る が 、 そ の フ ィ ー ル ド で 使 用 さ れ て い る struct timeval 型 は <sys/time.h> で 定 義 さ れ て い る )。

C ラ イ ブ ラ リ と カ ー ネ ル ABI の 違 い カ ー ネ ル 内 部 で は 、 nice 値 は 実 際 に は 40 〜 1 の 範 囲 を 使 っ て 表 現 さ れ て お り (負 の 値 は エ ラ ー コ ー ド と な る た め )、 こ ち ら の 値 が シ ス テ ム コ ー ル setpriority() と getpriority() で 使 用 さ れ て い る 。 glibc の こ れ ら の シ ス テ ム コ ー ル の ラ ッ パ ー 関 数 に お い て 、 nice 値 の ユ ー ザ ー 領 域 (user−land) と カ ー ネ ル 表 現 の 間 の 変 換 が 行 わ れ る 。 変 換 式 は unice = 20 − knice と な る 。 (し た が っ て 、 カ ー ネ ル の 40..1 の 範 囲 は ユ ー ザ ー 空 間 で 見 え る −20..19 の 範 囲 に 対 応 す る 。 )

バ グ

POSIX で は nice 値 は プ ロ セ ス 単 位 の 設 定 と な っ て い る 。 一 方 、 現 在 の POSIX ス レ ッ ド の Linux/NPTL 実 装 で は 、 nice 値 は ス レ ッ ド 単 位 の 属 性 で あ る 。 同 じ プ ロ セ ス の 別 々 の ス レ ッ ド が 異 な る nice 値 を 持 つ 場 合 が あ る 。 移 植 性 が 必 要 な ア プ リ ケ ー シ ョ ン で は こ の Linux の 動 作 を 前 提 す る の は 避 け る べ き で あ る 。 Linux の 動 作 は 将 来 標 準 に 準 拠 し た 動 作 に な る か も し れ な い 。

関 連 項 目

nice(1), renice(1), fork(2), capabilities(7), sched(7)

Linux カ ー ネ ル の ソ ー ス ツ リ ー 内 の Documentation/scheduler/sched−nice−design.txt (Linux 2.6.23 以 降 )

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。