Manpages

名 前

sched − ス ケ ジ ュ ー リ ン グ API の 概 要

説 明

API の 概 要
Linux の ス ケ ジ ュ ー リ ン グ API は 以 下 の と お り で あ る 。
sched_setscheduler(2) 指 定 さ れ た ス レ ッ ド の ス ケ ジ ュ ー リ ン グ ポ リ シ ー と パ ラ メ ー タ ー を 設 定 す る 。
sched_getscheduler(2) 指 定 さ れ た ス レ ッ ド の ス ケ ジ ュ ー リ ン グ ポ リ シ ー を 返 す 。
sched_setparam(2) 指 定 さ れ た ス レ ッ ド の ス ケ ジ ュ ー リ ン グ パ ラ メ ー タ ー を 設 定 す る 。
sched_getparam(2) 指 定 さ れ た ス レ ッ ド の ス ケ ジ ュ ー リ ン グ パ ラ メ ー タ ー を 取 得 す る 。
sched_get_priority_max(2) 指 定 さ れ た ス ケ ジ ュ ー リ ン グ ポ リ シ ー で 利 用 可 能 な 最 小 の 優 先 度 を 返 す 。
sched_get_priority_min(2) 指 定 さ れ た ス ケ ジ ュ ー リ ン グ ポ リ シ ー で 利 用 可 能 な 最 大 の 優 先 度 を 返 す 。
sched_rr_get_interval(2) 「 ラ ウ ン ド ロ ビ ン 」 ス ケ ジ ュ ー リ ン グ ポ リ シ ー で ス ケ ジ ュ ー リ グ さ れ る ス レ ッ ド で 使 用 さ れ る 単 位 時 間 (quantum) を 取 得 す る 。
sched_yield(2) 呼 び 出 し 元 が CPU の 使 用 権 を 明 け 渡 し て 、 他 の ス レ ッ ド が 実 行 で き る よ う に す る 。
sched_setaffinity(2)

(Linux 固 有 ) 指 定 さ れ た ス レ ッ ド の CPU affinity を 設 定 す る 。

sched_getaffinity(2)

(Linux 固 有 ) 指 定 さ れ た ス レ ッ ド の CPU affinity を 取 得 す る 。

sched_setattr(2) 指 定 さ れ た ス レ ッ ド の ス ケ ジ ュ ー リ ン グ ポ リ シ ー と パ ラ メ ー タ ー を 設 定 す る 。 こ の (Linux 固 有 の ) シ ス テ ム コ ー ル は sched_setscheduler(2)sched_setparam(2) の 両 方 の 機 能 を 持 つ 。
sched_getattr(2) 指 定 さ れ た ス レ ッ ド の ス ケ ジ ュ ー リ ン グ ポ リ シ ー と パ ラ メ ー タ ー を 取 得 す る 。 こ の (Linux 固 有 の ) シ ス テ ム コ ー ル は sched_getscheduler(2)sched_getparam(2) の 両 方 の 機 能 を 持 つ 。 ス ケ ジ ュ ー リ ン グ ポ リ シ ー (scheduling policy) ス ケ ジ ュ ー ラ (scheduler) と は カ ー ネ ル の 構 成 要 素 で 、 次 に CPU で 実 行 さ れ る 実 行 可 能 な ス レ ッ ド を 決 定 す る も の で あ る 。 各 々 の ス レ ッ ド に は 、 ス ケ ジ ュ ー リ ン グ ポ リ シ ー と 「 静 的 」 な ス ケ ジ ュ ー リ ン グ 優 先 度 sched_priority が 対 応 付 け ら れ る 。 ス ケ ジ ュ ー ラ は 、 シ ス テ ム 上 の 全 ス レ ッ ド の ス ケ ジ ュ ー リ ン グ ポ リ シ ー と 静 的 優 先 度 に 関 す る 知 識 に 基 づ い て 決 定 を 行 う 。 通 常 の ス ケ ジ ュ ー リ ン グ ポ リ シ ー (SCHED_OTHER, SCHED_IDLE, SCHED_BATCH) の 下 で ス ケ ジ ュ ー リ ン グ さ れ る ス レ ッ ド で は 、 sched_priority は ス ケ ジ ュ ー リ ン グ の 決 定 に 使 用 さ れ な い (sched_priority に は 0 を 指 定 し な け れ ば な ら な い )。 リ ア ル タ イ ム ス ケ ジ ュ ー リ ン グ ポ リ シ ー (SCHED_FIFO, SCHED_RR) の 下 で ス ケ ジ ュ ー リ ン グ さ れ る ス レ ッ ド は 、 sched_priority の 値 は 1 (最 低 ) か ら 99 (最 高 ) の 範 囲 と な る (数 字 か ら 分 か る よ う に 、 リ ア ル タ イ ム ス レ ッ ド は 常 に 通 常 の ス レ ッ ド よ り も 高 い 優 先 度 を 持 つ )。 こ こ で 注 意 す べ き な の は 、 POSIX.1−2001 が 要 求 し て い る の は 、 リ ア ル タ イ ム ポ リ シ ー の 実 装 に お い て 最 低 32 種 類 の 異 な る 優 先 度 レ ベ ル が サ ポ ー ト さ れ る こ と だ け で あ り 、 い く つ か の シ ス テ ム で は こ の 最 低 限 の 数 の 優 先 度 し か 提 供 さ れ て い な い 、 と い う こ と で あ る 。 移 植 性 が 必 要 な プ ロ グ ラ ム で は 、 sched_get_priority_min(2)sched_get_priority_max(2) を 使 っ て 、 あ る ポ リ シ ー が サ ポ ー ト す る 優 先 度 の 範 囲 を 調 べ る べ き で あ る 。 概 念 と し て は 、 ス ケ ジ ュ ー ラ は そ の sched_priority の 値 そ れ ぞ れ に 対 し て 実 行 可 能 な ス レ ッ ド の リ ス ト を 管 理 し て い る 。 ど の ス レ ッ ド を 次 に 実 行 す る か を 決 定 す る た め に 、 ス ケ ジ ュ ー ラ は 静 的 優 先 度 の 最 も 高 い 空 で な い リ ス ト を 探 し て 、 そ の リ ス ト の 先 頭 の ス レ ッ ド を 選 択 す る 。 各 ス レ ッ ド の ス ケ ジ ュ ー リ ン グ ポ リ シ ー は 、 そ の ス レ ッ ド が 同 じ 静 的 優 先 度 を 持 つ ス レ ッ ド の リ ス ト の 中 の ど こ に 挿 入 さ れ 、 こ の リ ス ト の 中 を ど の よ う に 移 動 す る か を 決 定 す る 。 全 て の ス ケ ジ ュ ー リ ン グ は プ リ エ ン プ テ ィ ブ (preemptive) で あ る : よ り 高 い 優 先 度 の ス レ ッ ド が 実 行 可 能 に な る と 、 現 在 実 行 中 の ス レ ッ ド は 実 行 権 を 取 り 上 げ ら れ (preempted)、 そ の ス レ ッ ド の 静 的 優 先 度 レ ベ ル の 待 ち リ ス ト に 戻 さ れ る 。 ス ケ ジ ュ ー リ ン グ ポ リ シ ー は 同 じ 静 的 優 先 度 を 持 つ 実 行 可 能 な ス レ ッ ド の リ ス ト の 中 で 順 番 の み を 決 定 す る 。

SCHED_FIFO: フ ァ ー ス ト イ ン フ ァ ー ス ト ア ウ ト ス ケ ジ ュ ー リ ン グ
SCHED_FIFO
は 0 よ り 大 き な 静 的 優 先 度 で の み 使 用 で き る 。 こ の ポ リ シ ー で は 、 SCHED_FIFO ス レ ッ ド が 実 行 可 能 に な っ た 場 合 、 そ の ポ リ シ ー が SCHED_OTHERSCHED_BATCHSCHED_IDLE の 現 在 実 行 中 の ス レ ッ ド は 直 ち に 実 行 権 を 取 り 上 げ ら れ る 。 SCHED_FIFO は 時 分 割 の な い 単 純 な ス ケ ジ ュ ー リ ン グ ア ル ゴ リ ズ ム で あ る 。 SCHED_FIFO ポ リ シ ー で ス ケ ジ ュ ー リ ン グ さ れ て い る ス レ ッ ド に は 以 下 の ル ー ル が 適 用 さ れ る :

* よ り 高 い 優 先 度 の 他 の ス レ ッ ド に よ っ て 取 っ て 代 わ ら れ た

SCHED_FIFO

レ ッ ド は そ の 優 先 度 の リ ス ト の 先 頭 に 留 ま り 続 け 、 よ り 高 い 優 先 度 の ス レ ッ ド 全 て が 停 止 (block) し た 場 合 に 実 行 を 再 開 す る 。

*

SCHED_FIFO ス レ ッ ド が 実 行 可 能 に な っ た 時 、 そ の 優 先 度 の リ ス ト の 最 後 に 挿 入 さ れ る 。

*

sched_setscheduler(2), sched_setparam(2), sched_setattr(2)pid で 指 定 さ れ た SCHED_FIFO (ま た は SCHED_RR) ス レ ッ ド が 実 行 可 能 な 場 合 、 リ ス ト の 最 初 に 置 く 。 結 果 と し て 、 も し 優 先 度 が 同 じ だ っ た 場 合 、 現 在 実 行 中 の ス レ ッ ド に 先 ん じ る か も し れ な い 。 (POSIX.1−2001 で は ス レ ッ ド は リ ス ト の 最 後 に 行 く べ き と 規 定 さ れ て い る 。 )

*

sched_yield(2) を 呼 び 出 し た ス レ ッ ド は リ ス ト の 最 後 に 置 か れ る 。

そ の 他 の イ ベ ン ト に よ っ て SCHED_FIFO ポ リ シ ー で ス ケ ジ ュ ー リ ン グ さ れ る ス レ ッ ド が 同 じ 優 先 度 の 実 行 可 能 な ス レ ッ ド の 待 ち リ ス ト の 中 を 移 動 す る こ と は な い 。

SCHED_FIFO ス レ ッ ド は I/O 要 求 に よ っ て 停 止 す る か 、 よ り 高 い 優 先 度 の ス レ ッ ド に よ っ て 置 き か え ら れ る か 、 sched_yield(2) を 呼 び 出 す ま で 実 行 を 続 け る 。

SCHED_RR: ラ ウ ン ド ロ ビ ン (round−robin) ス ケ ジ ュ ー リ ン グ
SCHED_RR
SCHED_FIFO の 単 純 な 拡 張 で あ る 。 上 述 さ れ た SCHED_FIFO に 関 す る 記 述 は 全 て SCHED_RR に 適 用 で き る 。 異 な る の は そ れ ぞ れ の ス レ ッ ド は 最 大 時 間 単 位 ま で し か 実 行 で き な い と い う こ と で あ る 。 SCHED_RR ス レ ッ ド が 時 間 単 位 と 同 じ か そ れ よ り 長 い 時 間 実 行 さ れ る と 、 そ の 優 先 度 の リ ス ト の 最 後 に 置 か れ る 。 よ り 高 い 優 先 度 の ス レ ッ ド に よ っ て 置 き か え ら れ 、 そ の 後 実 行 を 再 開 し た SCHED_RR ス レ ッ ド は 、 そ の ラ ウ ン ド ロ ビ ン 時 間 単 位 を 完 全 に 使 い 切 る ま で 実 行 さ れ る 。 そ の 時 間 単 位 の 長 さ は sched_rr_get_interval(2) を 使 っ て 取 得 で き る 。

SCHED_DEADLINE: 散 発 タ ス ク モ デ ル の デ ッ ド ラ イ ン ス ケ ジ ュ ー リ ン グ バ ー ジ ョ ン 3.14 以 降 で は 、 Linux は デ ッ ド ラ イ ン ス ケ ジ ュ ー リ ン グ ポ リ シ ー (SCHED_DEADLINE) が 提 供 さ れ る 。 現 在 の と こ ろ 、 こ の ポ リ シ ー は GEDF (Global Earliest Deadline First) を 使 っ て CBS (Constant Bandwidth Server) と の 組 み 合 わ せ で 実 装 さ れ て い る 。 こ の ポ リ シ ー と 関 連 す る 属 性 の 設 定 、 取 得 を 行 う に は 、 Linux 固 有 の シ ス テ ム コ ー ル sched_setattr(2)sched_getattr(2) を 使 用 す る 必 要 が あ る 。 散 発 タ ス ク (sporadic task) は ジ ョ ブ 列 を 持 つ タ ス ク で 、 各 ジ ョ ブ は 期 間 (period) あ た り 多 く と も 1 回 だ け 有 効 化 さ れ る 。 各 ジ ョ ブ に は relative deadline (相 対 デ ッ ド ラ イ ン ) と computation time (計 算 時 間 ) が あ る 。 相 対 デ ッ ド ラ イ ン は 、 そ の ジ ョ ブ が そ の デ ッ ド ラ イ ン よ り 前 に 実 行 が 終 了 す べ き で あ る こ と を 示 す 。 計 算 時 間 は 、 こ の ジ ョ ブ を 実 行 す る の に 必 要 な CPU 時 間 で あ る 。 新 し い ジ ョ ブ を 実 行 す る 必 要 が 出 て タ ス ク が 起 こ さ れ る 時 点 は arrival time (到 着 時 刻 ) と 呼 ば れ る (要 求 時 刻 (request time) や 解 放 時 刻 (release time) と 呼 ば れ る こ と も あ る )。 start time は タ ス ク が 実 行 を 開 始 す る 時 刻 で あ る 。 し た が っ て 、 absolute deadline (絶 対 デ ッ ド ラ イ ン ) は 到 着 時 刻 に 相 対 デ ッ ド ラ イ ン を 加 算 す る こ と で 求 め ら れ る 。 以 下 の 図 は こ れ ら の 用 語 を ま と め た も の で あ る 。

arrival/wakeup absolute deadline
| start time |
| | |
v v v
−−−−−x−−−−−−−−xooooooooooooooooo−−−−−−−−x−−−−−−−−x−−−
|<− comp. time −>|
|<−−−−−−− relative deadline −−−−−−>|
|<−−−−−−−−−−−−−− period −−−−−−−−−−−−−−−−−−−>|

sched_setattr(2) を 使 っ て ス レ ッ ド に SCHED_DEADLINE ポ リ シ ー を 設 定 す る 際 、 Runtime, Deadline, Period の 3 つ の パ ラ メ ー タ ー を 指 定 す る こ と が で き る 。 こ れ ら の パ ラ メ ー タ ー は 必 ず し も 上 で 述 べ た 用 語 に 対 応 し て い る わ け で は な い 。 よ く あ る 方 法 と し て は 、 Runtime に 平 均 計 算 時 間 (も し く は ハ ー ド リ ア ル タ イ ム タ ス ク の 場 合 は 最 悪 ケ ー ス の 実 行 時 間 ) よ り も 大 き な 値 を 、 Deadline に 相 対 デ ッ ド ラ イ ン を 、 Period に タ ス ク の 期 間 (period) を 設 定 す る 。 し た が っ て 、 SCHED_DEADLINE ス ケ ジ ュ ー リ ン グ で は 、 以 下 の よ う に な る 。

arrival/wakeup absolute deadline
| start time |
| | |
v v v
−−−−−x−−−−−−−−xooooooooooooooooo−−−−−−−−x−−−−−−−−x−−−
|<−− Runtime −−−−−−−>|
|<−−−−−−−−−−− Deadline −−−−−−−−−−−>|
|<−−−−−−−−−−−−−− Period −−−−−−−−−−−−−−−−−−−>|

3 つ の デ ッ ド ラ イ ン ス ケ ジ ュ ー リ ン グ パ ラ メ ー タ ー は sched_attr 構 造 体 の sched_runtime, sched_deadline, sched_period フ ィ ー ル ド に 対 応 す る 。 こ れ ら の フ ィ ー ル ド は ナ ノ 秒 単 位 の 値 で あ る 。 sched_period に 0 が 指 定 さ れ た 場 合 sched_deadline と 同 じ 値 に な る 。 カ ー ネ ル で は 以 下 の 関 係 が 成 り 立 つ こ と が 求 め ら れ る 。

sched_runtime <= sched_deadline <= sched_period こ れ に 加 え て 、 現 在 の 実 装 で は 、 す べ て の パ ラ メ ー タ ー 値 は 少 な く と も 1024 (実 装 の 粒 度 で あ る 1 マ イ ク ロ 秒 よ り も 少 し だ け 大 き な 値 ) で 2^63 よ り も 小 さ く な け れ ば な ら な い 。 こ れ ら の チ ェ ッ ク の い ず れ か が 失 敗 す る と 、 sched_setattr(2) は エ ラ ー EINVAL で 失 敗 す る 。

CBS に よ り タ ス ク 間 の 干 渉 が な い こ と が 保 証 さ れ る 。 指 定 さ れ た Runtime を 超 え て 実 行 し よ う と し た ス レ ッ ド は 絞 り 込 ま れ る こ と に な る 。 デ ッ ド ラ イ ン ス ケ ジ ュ ー リ ン グ の 保 証 が き ち ん と 機 能 す る た め に は 、 カ ー ネ ル は SCHEDULING ス レ ッ ド の 集 合 が 指 定 さ れ た 制 約 条 件 に お さ ま ら な い (ス ケ ジ ュ ー リ ン グ で き な い ) 状 況 を 防 止 し な け れ ば な ら な い 。 そ の た め 、 カ ー ネ ル は SCHED_DEADLINE ポ リ シ ー と 属 性 を 設 定 、 変 更 す る 際 に 、 受 け 入 れ チ ェ ッ ク (admittance test) を 実 行 す る 。 こ の 受 け 入 れ チ ェ ッ ク は 、 変 更 が 実 行 可 能 か を 計 算 し 、 も し 実 行 で き な い よ う で あ れ ば sched_setattr(2) は エ ラ ー EBUSY で 失 敗 す る 。 例 え ば 、 使 用 率 の 合 計 が 利 用 可 能 な 合 計 CPU 数 以 下 で あ る 必 要 が あ る (た だ し 、 必 ず し も 十 分 と い う わ け で は な い )。 な お 、 各 ス レ ッ ド は 最 大 で Period あ た り Runtime だ け 実 行 さ れ る こ と が あ る の で 、 そ の ス レ ッ ド の 使 用 率 は Runtime を Period で 割 っ た も の と な る 。 ス レ ッ ド が SCHED_DEADLINE ポ リ シ ー に 受 け 入 れ ら れ た 場 合 に 保 証 を 実 現 す る た め 、 SCHED_DEADLINE ス レ ッ ド は シ ス テ ム で (ユ ー ザ ー が 制 御 可 能 な ) 最 高 優 先 度 の ス レ ッ ド と な る 。 い ず れ か の SCHED_DEADLINE ス レ ッ ド が 実 行 可 能 で あ れ ば 、 他 の ポ リ シ ー で ス ケ ジ ュ ー リ ン グ さ れ て い る ス レ ッ ド は す べ て 横 取 り さ れ る 。

SCHED_DEADLINE ポ リ シ ー で ス ケ ジ ュ ー リ ン グ さ れ て い る ス レ ッ ド が fork(2) を 呼 び 出 す と 、 そ の ス レ ッ ド で reset−on−fork フ ラ グ が セ ッ ト さ れ て い る 場 合 (下 記 参 照 ) を 除 き 、 エ ラ ー EAGAIN で 失 敗 す る 。

SCHED_DEADLINE ス レ ッ ド が sched_yield(2) を 呼 び 出 す と 、 現 在 の ジ ョ ブ が CPU を 明 け 渡 し 、 新 し い 期 間 が 開 始 す る の を 待 つ 。

SCHED_OTHER: Linux の デ フ ォ ル ト の 時 分 割 ス ケ ジ ュ ー リ ン グ
SCHED_OTHER
は 静 的 優 先 度 0 で の み 使 用 で き る 。 SCHED_OTHER は Linux 標 準 の 時 分 割 ス ケ ジ ュ ー ラ で 、 特 別 な リ ア ル タ イ ム 機 構 を 必 要 と し て い な い 全 て の ス レ ッ ド で 使 用 さ れ る 。 実 行 す る ス レ ッ ド は 、 静 的 優 先 度 0 の リ ス ト か ら 、 こ の リ ス ト の 中 だ け で 決 定 さ れ る 「 動 的 な 」 優 先 度 (dynamic priority) に 基 い て 決 定 さ れ る 。 動 的 な 優 先 度 は (nice(2), setpriority(2), sched_setattr(2) に よ り 設 定 さ れ る ) nice 値 に 基 づ い て 決 定 さ れ る も の で 、 単 位 時 間 毎 に 、 ス レ ッ ド が 実 行 可 能 だ が 、 ス ケ ジ ュ ー ラ に よ り 実 行 が 拒 否 さ れ た 場 合 に イ ン ク リ メ ン ト さ れ る 。 こ れ に よ り 、 全 て の SCHED_OTHER ス レ ッ ド で の 公 平 性 が 保 証 さ れ る 。

SCHED_BATCH: バ ッ チ プ ロ セ ス の ス ケ ジ ュ ー リ ン グ
(Linux 2.6.16 以 降 ) SCHED_BATCH は 静 的 優 先 度 0 で の み 使 用 で き る 。 こ の ポ リ シ ー は (nice 値 に 基 づ く ) 動 的 な 優 先 度 に し た が っ て ス レ ッ ド の ス ケ ジ ュ ー リ ン グ が 行 わ れ る と い う 点 で 、 SCHED_OTHER に 似 て い る 。 異 な る の は 、 こ の ポ リ シ ー で は 、 ス レ ッ ド が 常 に CPU に 負 荷 の か か る (CPU−intensive) 処 理 を 行 う と 、 ス ケ ジ ュ ー ラ が 仮 定 す る 点 で あ る 。 ス ケ ジ ュ ー ラ は ス レ ッ ド を 呼 び 起 こ す 毎 に そ の ス レ ッ ド に ス ケ ジ ュ ー リ ン グ 上 の ペ ナ ル テ ィ を 少 し 課 し 、 そ の 結 果 、 こ の ス レ ッ ド は ス ケ ジ ュ ー リ ン グ の 決 定 で 若 干 冷 遇 さ れ る よ う に な る 。 こ の ポ リ シ ー は 、 非 対 話 的 な 処 理 だ が そ の nice 値 を 下 げ た く な い 処 理 や 、 (処 理 の タ ス ク 間 で ) 余 計 な タ ス ク の 置 き 換 え の 原 因 と あ る 対 話 的 な 処 理 な し で 確 定 的 な (deterministic) ス ケ ジ ュ ー リ ン グ ポ リ シ ー を 適 用 し た い 処 理 に 対 し て 有 効 で あ る 。

SCHED_IDLE: 非 常 に 優 先 度 の 低 い ジ ョ ブ の ス ケ ジ ュ ー リ ン グ
(Linux 2.6.23 以 降 ) SCHED_IDLE は 静 的 優 先 度 0 で の み 使 用 で き る 。 こ の ポ リ シ ー で は プ ロ セ ス の nice 値 は ス ケ ジ ュ ー リ ン グ に 影 響 を 与 え な い 。 非 常 に 低 い 優 先 度 で の ジ ョ ブ の 実 行 を 目 的 と し た も の で あ る (非 常 に 低 い 優 先 度 と は 、 ポ リ シ ー SCHED_OTHERSCHED_BATCH で の nice 値 +19 よ り さ ら に 低 い 優 先 度 で あ る )。 子 プ ロ セ ス で の ス ケ ジ ュ ー リ ン グ ポ リ シ ー の リ セ ッ ト 各 ス レ ッ ド に は reset−on−fork ス ケ ジ ュ ー リ ン グ フ ラ グ が あ る 。 こ の フ ラ グ が セ ッ ト さ れ る と 、 fork(2) で 作 成 さ れ る 子 プ ロ セ ス は 特 権 ス ケ ジ ュ ー リ ン グ ポ リ シ ー を 継 承 し な い 。 reset−on−fork フ ラ グ は 以 下 の い ず れ か の 方 法 で セ ッ ト で き る 。

*

sched_setscheduler(2) を 呼 び 出 す 際 に SCHED_RESET_ON_FORK フ ラ グ を policy 引 き 数 に 論 理 和 で 指 定 す る (Linux 2.6.32 以 降 )。

*

sched_setattr(2) を 呼 び 出 し 際 に attr.sched_flagsSCHED_FLAG_RESET_ON_FORK フ ラ グ を 指 定 す る 。

こ れ ら の 2 つ の API で 使 用 さ れ る 定 数 は 名 前 が 違 っ て い る 点 に 注 意 す る こ と 。 同 様 に reset−on−fork フ ラ グ の 状 態 は sched_getscheduler(2)sched_getattr(2) を 使 っ て 取 得 で き る 。

reset−on−fork 機 能 は メ デ ィ ア 再 生 ア プ リ ケ ー シ ョ ン で の 利 用 を 意 図 し た も の で あ る 。 複 数 の 子 プ ロ セ ス を 作 成 す る こ と で 、 ア プ リ ケ ー シ ョ ン は RLIMIT_RTTIME リ ソ ー ス 上 限 (getrlimit(2) を 参 照 ) を 避 け る こ と が で き る 。 よ り 正 確 に は 、 reset−on−fork フ ラ グ が セ ッ ト さ れ た 場 合 、 そ れ 以 降 に 作 成 さ れ る 子 プ ロ セ ス に 以 下 の ル ー ル が 適 用 さ れ る 。

* 呼 び 出 し た ス レ ッ ド の ス ケ ジ ュ ー リ ン グ ポ リ シ ー が

SCHED_FIFO

SCHED_RR の 場 合 、 子 プ ロ セ ス の ポ リ シ ー は SCHED_OTHER に リ セ ッ ト さ れ る 。

* 子 プ ロ セ ス が 負 の

nice 値 を 持 っ て い る 場 合 、 子 プ ロ セ ス の nice 値 は 0

に リ セ ッ ト さ れ る 。 一 度 reset−on−fork フ ラ グ が 有 効 に さ れ た 後 は 、 こ の フ ラ グ を リ セ ッ ト で き る の は 、 ス レ ッ ド が CAP_SYS_NICE ケ ー パ ビ リ テ ィ を 持 つ 場 合 だ け で あ る 。 こ の フ ラ グ は fork(2) で 作 成 さ れ た 子 プ ロ セ ス で は 無 効 に な る 。 特 権 と リ ソ ー ス 制 限

2.6.12 よ り 前 の バ ー ジ ョ ン の Linux カ ー ネ ル で は 、 特 権 ス レ ッ ド (CAP_SYS_NICE ケ ー パ ビ リ テ ィ を 持 つ ス レ ッ ド ) だ け が 0 以 外 の 静 的 優 先 度 を 設 定 す る (す な わ ち 、 リ ア ル タ イ ム ス ケ ジ ュ ー リ ン グ ポ リ シ ー を 設 定 す る ) こ と が で き る 。 非 特 権 ス レ ッ ド が で き る 変 更 は SCHED_OTHER ポ リ シ ー を 設 定 す る こ と だ け で あ り 、 さ ら に 、 こ の 変 更 を 行 え る の は 、 呼 び 出 し 元 の 実 効 ユ ー ザ ー ID が ポ リ シ ー の 変 更 対 象 ス レ ッ ド (pid で 指 定 さ れ た ス レ ッ ド ) の 実 ユ ー ザ ー ID か 実 効 ユ ー ザ ー ID と 一 致 す る 場 合 だ け で あ る 。

SCHED_DEADLINE ポ リ シ ー を 設 定 、 変 更 す る に は 、 ス レ ッ ド が 特 権 (CAP_SYS_NICE) を 持 っ て い な け れ ば な ら な い 。

Linux 2.6.12 以 降 で は 、 リ ソ ー ス 制 限 RLIMIT_RTPRIO が 定 義 さ れ て お り 、 ス ケ ジ ュ ー リ ン グ ポ リ シ ー が SCHED_RRSCHED_FIFO の 場 合 の 、 非 特 権 ス レ ッ ド の 静 的 優 先 度 の 上 限 を 定 め て い る 。 ス ケ ジ ュ ー リ ン グ ポ リ シ ー と 優 先 度 を 変 更 す る 際 の ル ー ル は 以 下 の 通 り で あ る 。

* 非 特 権 ス レ ッ ド に

0 以 外 の RLIMIT_RTPRIO ソ フ ト リ ミ ッ ト が 設 定 さ れ て い

る 場 合 、 非 特 権 ス レ ッ ド は そ の ス レ ッ ド の ス ケ ジ ュ ー リ ン グ ポ リ シ ー と 優 先 度 を 変 更 で き る が 、 優 先 度 を 現 在 の 自 身 の 優 先 度 と RLIMIT_RTPRIO ソ フ ト リ ミ ッ ト の 大 き い 方 よ り も 高 い 値 に 設 定 で き な い と い う 制 限 が 課 さ れ る 。

*

RLIMIT_RTPRIO ソ フ ト リ ミ ッ ト が 0 の 場 合 、 優 先 度 を 下 げ る か 、 リ ア ル タ イ ム で な い ポ リ シ ー へ 切 り 替 え る か の 変 更 だ け が 許 可 さ れ る 。

*

あ る 非 特 権 ス レ ッ ド が 別 の ス レ ッ ド に 対 し て こ れ ら の 変 更 を 行 う 際 に も 、 同 じ ル ー ル が 適 用 さ れ る 。 変 更 を 行 え る の は 、 変 更 を 行 お う と す る ス レ ッ ド の 実 効 ユ ー ザ ー ID が 変 更 対 象 の ス レ ッ ド の 実 ユ ー ザ ー ID か 実 効 ユ ー ザ ー ID と 一 致 し て い る 場 合 に 限 ら れ る 。
*

SCHED_IDLE ポ リ シ ー の 場 合 に は 特 別 な ル ー ル が 適 用 さ れ る 。 2.6.39 よ り 前 の Linux カ ー ネ ル で は 、 こ の ポ リ シ ー で 動 作 す る 非 特 権 ス レ ッ ド は 、 RLIMIT_RTPRIO リ ソ ー ス 上 限 の 値 に 関 わ ら ず 、 自 分 の ポ リ シ ー を 変 更 す る こ と が で き な い 。 2.6.39 以 降 の Linux カ ー ネ ル で は 、 非 特 権 ス レ ッ ド は 、 自 分 の nice 値 が RLIMIT_NICE リ ソ ー ス 上 限 (getrlimit(2) 参 照 ) で 許 可 さ れ た 範 囲 で あ る 限 り は 、 自 分 の ス ケ ジ ュ ー リ ン グ ポ リ シ ー を SCHED_BATCHSCHED_NORMAL ポ リ シ ー に 切 り 替 え る こ と が で き る 。

特 権 ス レ ッ ド (CAP_SYS_NICE ケ ー パ ビ リ テ ィ を 持 つ ス レ ッ ド ) の 場 合 、 RLIMIT_RTPRIO の 制 限 は 無 視 さ れ る ; 古 い カ ー ネ ル と 同 じ よ う に 、 ス ケ ジ ュ ー リ ン グ ポ リ シ ー と 優 先 度 に 対 し 任 意 の 変 更 を 行 う こ と が で き る 。 RLIMIT_RTPRIO に 関 す る も っ と 詳 し い 情 報 は getrlimit(2) を 参 照 の こ と 。 リ ア ル タ イ ム プ ロ セ ス と デ ッ ド ラ イ ン プ ロ セ ス の CPU 使 用 量 を 制 限 す る

SCHED_FIFO, SCHED_RR, SCHED_DEADLINE で ス ケ ジ ュ ー リ ン グ さ れ る ス レ ッ ド が 停 止 せ ず に 無 限 ル ー プ に 陥 る と 、 他 の 全 て の よ り 低 い 優 先 度 の ス レ ッ ド を 永 久 に 停 止 (block) さ せ て し ま う 。 Linux 2.6.25 よ り 前 で は 、 リ ア ル タ イ ム プ ロ セ ス が 暴 走 し て し ま い 、 シ ス テ ム が 止 ま っ て し ま う の を 防 止 す る 唯 一 の 方 法 は 、 (コ ン ソ ー ル で ) シ ェ ル を テ ス ト 対 象 の ア プ リ ケ ー シ ョ ン よ り も 高 い 静 的 優 先 度 で 実 行 す る こ と だ け で あ っ た 。 こ れ に よ っ て 期 待 通 り に 停 止 し た り 終 了 し た り し な い リ ア ル タ イ ム ア プ リ ケ ー シ ョ ン を 緊 急 終 了 さ せ る こ と が 可 能 に な る 。

Linux 2.6.25 以 降 で は 、 暴 走 し た リ ア ル タ イ ム プ ロ セ ス や デ ッ ド ラ イ ン プ ロ セ ス を 扱 う 別 の 方 法 が 提 供 さ れ て い る 。 一 つ は RLIMIT_RTTIME リ ソ ー ス 上 限 を 使 っ て リ ア ル タ イ ム プ ロ セ ス が 消 費 で き る CPU 時 間 の 上 限 を 設 定 す る 方 法 で あ る 。 詳 細 は getrlimit(2) を 参 照 。

Linux 2.6.25 以 降 で は 、 2 つ の /proc フ ァ イ ル を 使 っ て 、 リ ア ル タ イ ム で な い プ ロ セ ス が 使 用 で き る CPU 時 間 を 一 定 量 予 約 す る こ と が で き る 。 こ の 方 法 で CPU 時 間 を い く ら か 予 約 し て お く こ と で 、 CPU 時 間 が (例 え ば ) root シ ェ ル に 割 り 当 て ら れ 、 こ の シ ェ ル か ら 暴 走 し た プ ロ セ ス を 殺 す こ と が で き る 。 こ れ ら の フ ァ イ ル で は 両 方 と も マ イ ク ロ 秒 で 時 間 を 指 定 す る 。
/proc/sys/kernel/sched_rt_period_us
こ の フ ァ イ ル は 、 CPU 時 間 100% に あ た る ス ケ ジ ュ ー リ ン グ 間 隔 を 指 定 す る 。 こ の フ ァ イ ル の 値 と し て 1 か ら INT_MAX を 指 定 で き る 。 こ の 値 は 実 際 の 時 間 と し て は 1 マ イ ク ロ 秒 か ら 約 35 分 に 相 当 す る 。 こ の フ ァ イ ル の デ フ ォ ル ト 値 は 1,000,000 (1 秒 ) で あ る 。
/proc/sys/kernel/sched_rt_runtime_us
こ の フ ァ イ ル の 値 は 、 シ ス テ ム 上 の リ ア ル タ イ ム ス ケ ジ ュ ー リ ン グ や デ ッ ド ラ イ ン ス ケ ジ ュ ー リ ン グ の 全 プ ロ セ ス が 使 用 で き る 「 期 間 」 を 指 定 す る 。 こ の フ ァ イ ル の 値 と し て −1 か ら INT_MAX−1 を 指 定 で き る 。 −1 を 指 定 す る と 、 実 行 時 間 (runtime) は ス ケ ジ ュ ー リ ン グ 間 隔 (period) と 同 じ に な る 。 つ ま り 、 CPU 時 間 は リ ア ル タ イ ム で な い プ ロ セ ス に は 確 保 さ れ な い (カ ー ネ ル 2.6.25 よ り 前 の Linux の 動 作 で あ る )。 こ の フ ァ イ ル の デ フ ォ ル ト 値 は 950,000 (0.95 秒 ) で あ る 。 こ れ は CPU 時 間 の 5% が リ ア ル タ イ ム や デ ッ ド ラ イ ン ス ケ ジ ュ ー リ ン グ ポ リ シ ー 以 外 で 動 作 す る プ ロ セ ス に 確 保 さ れ る と い う 意 味 す る 。 応 答 時 間 (response time)
I/O 待 ち で 停 止 し た よ り 高 い 優 先 度 の ス レ ッ ド は 再 び ス ケ ジ ュ ー リ ン グ さ れ る 前 に い く ら か の 応 答 時 間 が か か る 。 デ バ イ ス ド ラ イ バ ー を 書 く 場 合 に は "slow interrupt" 割 り 込 み ハ ン ド ラ ー を 使 用 す る こ と で こ の 応 答 時 間 を 劇 的 に 減 少 さ せ る こ と が で き る 。 そ の 他 子 プ ロ セ ス は fork(2) の 際 に 親 プ ロ セ ス の ス ケ ジ ュ ー リ ン グ ポ リ シ ー と パ ラ メ ー タ ー を 継 承 す る 。 execve(2) の 前 後 で 、 ス ケ ジ ュ ー リ ン グ ポ リ シ ー と パ ラ メ ー タ ー は 保 持 さ れ る 。 リ ア ル タ イ ム プ ロ セ ス は 大 抵 、 ペ ー ジ ン グ の 待 ち 時 間 を 避 け る た め に mlock(2)mlockall(2) を 使 っ て メ モ リ ー ロ ッ ク を し な け れ ば な ら な い 。

注 意

も と も と は 、 標 準 の Linux は 一 般 目 的 の オ ペ レ ー テ ィ ン グ シ ス テ ム と し て 設 計 さ れ て お り 、 バ ッ ク グ ラ ウ ン ド プ ロ セ ス や 対 話 的 ア プ リ ケ ー シ ョ ン 、 リ ア ル タ イ ム 性 の 要 求 が 厳 し く な い リ ア ル タ イ ム ア プ リ ケ ー シ ョ ン (普 通 は タ イ ミ ン グ の 応 答 期 限 (deadline) を 満 た す 必 要 が あ る ア プ リ ケ ー シ ョ ン ) を 扱 う こ と が で き た 。 Linux カ ー ネ ル 2.6 で は 、 カ ー ネ ル の プ リ エ ン プ シ ョ ン (タ ス ク の 置 き 換 え ) が 可 能 で あ り 、 新 た に 導 入 さ れ た O(1) ス ケ ジ ュ ー ラ に よ り 、 ア ク テ ィ ブ な タ ス ク の 数 に 関 わ ら ず ス ケ ジ ュ ー リ ン グ に 必 要 な 時 間 は 固 定 で 確 定 的 (deterministic) で あ る こ と が 保 証 さ れ て い る 。 そ れ に も 関 わ ら ず 、 カ ー ネ ル 2.6.17 ま で は 真 の リ ア ル タ イ ム コ ン ピ ュ ー テ ィ ン グ は 実 現 で き な か っ た 。 本 流 の Linux カ ー ネ ル で の リ ア ル タ イ ム 機 能 カ ー ネ ル 2.6.18 か ら 現 在 ま で 、 Linux は 徐 々 に リ ア ル タ イ ム 機 能 を 備 え つ つ あ る が 、 こ れ ら の 機 能 の ほ と ん ど は 、 Ingo Molnar, Thomas Gleixner, Steven Rostedt ら に よ っ て 開 発 さ れ た 、 以 前 の realtime−preempt パ ッ チ か ら の も の で あ る 。 こ れ ら の パ ッ チ が 本 流 の カ ー ネ ル に 完 全 に マ ー ジ さ れ る ま で は (マ ー ジ の 完 了 は カ ー ネ ル 2.6.30 あ た り の 予 定 )、 最 高 の リ ア ル タ イ ム 性 能 を 達 成 す る に は realtime−preempt パ ッ チ を 組 み 込 ま な け れ ば な ら な い 。 こ れ ら の パ ッ チ は

patch−kernelversion−rtpatchversion と い う 名 前 で 、 http://www.kernel.org/pub/linux/kernel/projects/rt/">http://www.kernel.org/pub/linux/kernel/projects/rt/ か ら ダ ウ ン ロ ー ド で き る 。 こ の パ ッ チ が 適 用 さ れ ず 、 か つ パ ッ チ の 内 容 の 本 流 の カ ー ネ ル へ の マ ー ジ が 完 了 す る ま で は 、 カ ー ネ ル の 設 定 で は CONFIG_PREEMPT_NONE, CONFIG_PREEMPT_VOLUNTARY, CONFIG_PREEMPT_DESKTOP の 3つ の プ リ エ ン プ シ ョ ン ク ラ ス (preemption class) だ け が 提 供 さ れ る 。 こ れ ら の ク ラ ス で は 、 最 悪 の 場 合 の ス ケ ジ ュ ー リ ン グ 遅 延 が そ れ ぞ れ 全 く 減 ら な い 、 い く ら か 減 る 、 か な り 減 る 。 パ ッ チ が 適 用 さ れ た 場 合 、 ま た は パ ッ チ の 内 容 の 本 流 の カ ー ネ ル へ の マ ー ジ が 完 了 し た 後 で は 、 上 記 に 加 え て 設 定 項 目 と し て CONFIG_PREEMPT_RT が 利 用 可 能 に な る 。 こ の 項 目 を 選 択 す る と 、 Linux は 通 常 の リ ア ル タ イ ム オ ペ レ ー テ ィ ン グ シ ス テ ム に 変 身 す る 。 こ の 場 合 に は 、 FIFO と RR の ス ケ ジ ュ ー リ ン グ ポ リ シ ー は 、 真 の リ ア ル タ イ ム 優 先 度 を 持 つ ス レ ッ ド を 最 悪 の 場 合 の ス ケ ジ ュ ー リ ン グ 遅 延 が 最 小 と な る 環 境 で 動 作 さ せ る た め に 使 わ れ る こ と に な る 。

関 連 項 目

chrt(1), taskset(1), getpriority(2), mlock(2), mlockall(2), munlock(2), munlockall(2), nice(2), sched_get_priority_max(2), sched_get_priority_min(2), sched_getscheduler(2), sched_getaffinity(2), sched_getparam(2), sched_rr_get_interval(2), sched_setaffinity(2), sched_setscheduler(2), sched_setparam(2), sched_yield(2), setpriority(2), pthread_getaffinity_np(3), pthread_setaffinity_np(3), sched_getcpu(3), capabilities(7), cpuset(7)

Programming for the real world − POSIX.4 by Bill O. Gallmeister, O’Reilly & Associates, Inc., ISBN 1−56592−074−0.

Linux カ ー ネ ル ソ ー ス の フ ァ イ ル Documentation/scheduler/sched−deadline.txt, Documentation/scheduler/sched−rt−group.txt, Documentation/scheduler/sched−design−CFS.txt, Documentation/scheduler/sched−nice−design.txt

こ の 文 書 に つ い て

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