名 前
ioprio_get, ioprio_set − I/O ス ケ ジ ュ ー リ ン グ ク ラ ス と 優 先 度 の 設 定 /取 得
書 式
int
ioprio_get(int which, int who);
int ioprio_set(int which, int
who, int ioprio); 注
意 : こ れ ら の シ
ス テ ム コ ー ル
に は glibc ラ ッ パ ー
関 数 は 存 在 し
な い 。 「 注 意
」 の 節 を 参 照
。
説 明
シ ス テ ム コ ー ル ioprio_get() / ioprio_set() は 、 (1つ 以 上 の ) ス レ ッ ド の I/O ス ケ ジ ュ ー リ ン グ ク ラ ス と 優 先 度 の 取 得 /設 定 を 行 う 。
which
と who 引 き 数 で
シ ス テ ム コ ー
ル の 操 作 対 象
と な る ス レ ッ
ド を 指 示 す る
。 which 引 き 数 は
、 who を ど の よ
う に 解 釈 す る
か を 決 め る も
の で 、 以 下 の
い ず れ か 一 つ
を 指 定 す る 。
IOPRIO_WHO_PROCESS
who は 特 定 の プ ロ セ ス や ス レ ッ ド を 特 定 す る た め の プ ロ セ ス ID か ス レ ッ ド ID で あ る 。 who が 0 の 場 合 、 呼 び 出 し 元 の ス レ ッ ド に 対 し て 操 作 が 行 わ れ る 。
IOPRIO_WHO_PGRP
who は プ ロ セ ス グ ル ー プ ID で あ り 、 プ ロ セ ス グ ル ー プ の 全 メ ン バ が 対 象 と な る 。 who が 0 の 場 合 、 呼 び 出 し 元 が メ ン バ ー と な っ て い る プ ロ セ ス グ ル ー プ に 対 し て 操 作 が 行 わ れ る 。
IOPRIO_WHO_USER
who は ユ ー ザ ー ID で あ り 、 実 UID に 一 致 す る 全 プ ロ セ ス が 対 象 と な る 。
ioprio_get() の 呼 び 出 し 時 に which に IOPRIO_WHO_PGRP か IOPRIO_WHO_USER が 指 定 さ れ 、 who に 一 致 す る プ ロ セ ス が 複 数 あ っ た 場 合 、 一 致 す る プ ロ セ ス 全 体 の 中 で 最 も 高 い 優 先 度 が 返 さ れ る 。 優 先 度 が 高 い と は 、 よ り 高 い 優 先 度 ク ラ ス に 属 し て い る (IOPRIO_CLASS_RT が 最 も 高 い 優 先 度 ク ラ ス で 、 IOPRIO_CLASS_IDLE が 最 も 低 い )、 も し く は 同 じ 優 先 度 ク ラ ス に 属 し て い る が 優 先 度 レ ベ ル が 高 い (優 先 度 番 号 が 小 さ い 方 が 優 先 度 レ ベ ル が 高 い こ と を 意 味 す る )、 と い う こ と で あ る 。
ioprio_set()
に 渡 す ioprio 引 き
数 は 、 対 象 と
な る プ ロ セ ス
に 割 り 当 て る
ス ケ ジ ュ ー リ
ン グ ク ラ ス と
優 先 度 の 両 方
を 指 定 す る ビ
ッ ト マ ス ク で
あ る 。 ioprio の 値
を 組 み 立 て た
り 解 釈 す る の
に 、 以 下 の マ
ク ロ が 利 用 で
き る 。
IOPRIO_PRIO_VALUE(class,
data) ス ケ ジ ュ
ー リ ン グ ク ラ
ス class と 優 先 度
(data) を 与 え る と
、 こ の マ ク ロ
は 2つ の 値 を 組
み 合 わ せ て 、
ioprio 値 を 生 成 し
、 マ ク ロ の 結
果 と し て 返 す
。
IOPRIO_PRIO_CLASS(mask)
mask (ioprio 値 ) を 与 え る と 、 こ の マ ク ロ は I/O ク ラ ス 要 素 、 つ ま り IOPRIO_CLASS_RT, IOPRIO_CLASS_BE, IOPRIO_CLASS_IDLE の い ず れ か 一 つ の 値 を 返 す 。
IOPRIO_PRIO_DATA(mask)
mask (ioprio 値 ) を 与 え る と 、 こ の マ ク ロ は 優 先 度 (data) 要 素 を 返 す 。 ス ケ ジ ュ ー リ ン グ ク ラ ス と 優 先 度 に 関 す る 詳 し い 情 報 は 、 「 備 考 」 の 節 を 参 照 の こ と 。
I/O 優 先 度 は 読 み 出 し と 同 期 書 き 込 み (O_DIRECT, O_SYNC) に 対 応 し て い る 。 I/O 優 先 度 は 非 同 期 書 き 込 み に は 対 応 し て い な い 。 な ぜ な ら 、 非 同 期 書 き 込 み は メ モ リ ー 書 き 換 え を 行 う プ ロ グ ラ ム の 動 作 (context) と は 関 係 な く 発 行 さ れ 、 そ の た め プ ロ グ ラ ム 単 位 の 優 先 度 は 適 用 さ れ な い か ら で あ る 。
返 り 値
成 功 す る と 、 ioprio_get() は 、 which と who で 指 定 さ れ た 基 準 に 合 致 し た 全 プ ロ セ ス で 最 も 高 い I/O 優 先 度 を 持 つ プ ロ セ ス の ioprio 値 を 返 す 。 エ ラ ー の 場 合 、 −1 を 返 し 、 errno に エ ラ ー を 示 す 値 を 設 定 す る 。 成 功 す る と 、 ioprio_set() は 0 を 返 す 。 エ ラ ー の 場 合 、 −1 を 返 し 、 errno に エ ラ ー を 示 す 値 を 設 定 す る 。
エ ラ ー
EINVAL |
which か ioprio の 値 が 不 正 で あ る 。 ioprio 用 に 指 定 可 能 な ス ケ ジ ュ ー ラ ク ラ ス と 優 先 度 レ ベ ル に つ い て は 「 備 考 」 を 参 照 の こ と 。
呼 び 出
し 元 プ ロ セ ス
が 、 指 定 さ れ
た プ ロ セ ス に
ioprio を 割 り 当 て
る の に 必 要 な
権 限 を 持 っ て
い な い 。 ioprio_set()
に 必 要 な 権 限
に つ い て の 詳
し い 情 報 は 「
備 考 」 の 節 を
参 照 の こ と 。
which と who で 指 定 さ れ た 基 準 に 合 致 す る プ ロ セ ス が 見 つ か ら な か っ た 。 バ ー ジ ョ ンこ れ ら の シ ス テ ム コ ー ル は カ ー ネ ル 2.6.13 以 降 の Linux で 利 用 可 能 で あ る 。 準 拠こ れ ら の シ ス テ ム コ ー ル は Linux 独 自 で あ る 。 注 意glibc は こ れ ら の シ ス テ ム コ ー ル に 対 す る ラ ッ パ ー 関 数 を 提 供 し て い な い 。 syscall(2) を 使 っ て 呼 び 出 す こ と 。 複 数 の プ ロ セ ス や ス レ ッ ド が 一 つ の I/O コ ン テ キ ス ト を 共 有 す る 場 合 が あ る 。 clone(2) を CLONE_IO フ ラ グ 付 き で 呼 び 出 し た 場 合 に は こ の 状 況 と な る 。 し か し な が ら 、 デ フ ォ ル ト で は 、 一 つ の プ ロ セ ス の 個 々 の ス レ ッ ド は I/O コ ン テ キ ス ト を 共 有 「 し な い 」 。 し た が っ て 、 プ ロ セ ス 内 の す べ て の ス レ ッ ド の I/O 優 先 度 を 変 更 し た い 場 合 に は 、 そ れ ぞ れ の ス レ ッ ド に 対 し て ioprio_set() を 呼 び 出 す 必 要 が あ る 。 こ の 操 作 を 行 う の に 必 要 と な る ス レ ッ ド ID に は gettid(2) か clone(2) が 返 す 値 を 指 定 す る 。 こ れ ら の シ ス テ ム コ ー ル は 、 I/O 優 先 度 に 対 応 し た I/O ス ケ ジ ュ ー ラ と 組 み 合 わ せ て 使 用 さ れ た 場 合 に の み 効 果 を 持 つ 。 カ ー ネ ル 2.6.17 で は 、 こ の 条 件 を 満 た す ス ケ ジ ュ ー ラ は Completely Fair Queuing (CFQ) I/O ス ケ ジ ュ ー ラ だ け で あ る 。 I/O ス
ケ ジ ュ ー ラ の
選 択 $ cat
/sys/block/hda/queue/scheduler $ su
Completely
Fair Queuing (CFQ) I/O ス ケ ジ ュ
ー ラ バ ー ジ ョ
ン 3 (別 名 CFQ Time Sliced) 以
降 、 CPU ス ケ ジ ュ
ー リ ン グ と 同
様 の I/O nice レ ベ ル
が CFQ に 実 装 さ れ
て い る 。 こ れ
ら の nice レ ベ ル は
3つ の ス ケ ジ ュ
ー リ ン グ ク ラ
ス に 分 類 で き
、 各 ス ケ ジ ュ
ー リ ン グ ク ラ
ス に つ き 1つ 以
上 の 優 先 度 レ
ベ ル が 定 義 さ
れ て い る 。 CFQ I/O ス ケ ジ ュ ー ラ の 更 な る 情 報 と サ ン プ ル プ ロ グ ラ ム に つ い て は Documentation/block/ioprio.txt を 参 照 の こ と 。 I/O 優 先 度 の 設 定 に 必 要 な 許 可 プ ロ セ ス の 優 先 度 を 変 更 す る 許 可 が 得 ら れ る か ど う か は 以 下 の 2つ の 条 件 に 基 い て 決 定 さ れ る 。 プ ロ セ ス の 所 有 権 非 特 権 プ ロ セ ス は 、 プ ロ セ ス の 実 UID が 呼 び 出 し 元 プ ロ セ ス の 実 UID も し く は 実 効 UID と 一 致 す る プ ロ セ ス の I/O 優 先 度 の み を 設 定 で き る 。 CAP_SYS_NICE ケ ー パ ビ リ テ ィ を 持 つ プ ロ セ ス は 、 ど の プ ロ セ ス の 優 先 度 で も 変 更 で き る 。 ど の 優 先 度 に 設 定 し よ う と し て い る か 非 常 に 高 い 優 先 度 (IOPRIO_CLASS_RT) を 設 定 し よ う と す る 場 合 、 CAP_SYS_ADMIN ケ ー パ ビ リ テ ィ が 必 要 で あ る 。 カ ー ネ ル 2.6.24 以 前 で は 、 非 常 に 低 い 優 先 度 (IOPRIO_CLASS_IDLE) を 設 定 す る た め に も CAP_SYS_ADMIN ケ ー パ ビ リ テ ィ が 必 要 で あ っ た が 、 Linux 2.6.25 以 降 で は も は や 必 要 な く な っ た 。 ioprio_set() は こ の 両 方 の ル ー ル に 従 い 、 条 件 を 満 た さ な い 場 合 、 エ ラ ー EPERM で 失 敗 す る 。 バ グglibc は 、 こ の ペ ー ジ に 記 載 さ れ た 関 数 プ ロ ト タ イ プ や マ ク ロ を 定 義 す る 適 切 な ヘ ッ ダ ー フ ァ イ ル を ま だ 提 供 し て い な い 。 必 要 な 定 義 に つ い て は linux/ioprio.h を 見 れ ば よ い 。 関 連 項 目ionice(1), getpriority(2), open(2), capabilities(7) Linux カ ー ネ ル ソ ー ス 内 の Documentation/block/ioprio.txt こ の 文 書 に つ い てこ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。 |