名 前
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 を 設 定 す る 。
(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_OTHER、
SCHED_BATCH、 SCHED_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_OTHER
か SCHED_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_flags に SCHED_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_RR と SCHED_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_BATCH か SCHED_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 シ ェ
ル に 割 り 当 て
ら れ 、 こ の シ
ェ ル か ら 暴 走
し た プ ロ セ ス
を 殺 す こ と が
で き る 。 こ れ
ら の フ ァ イ ル
で は 両 方 と も
マ イ ク ロ 秒 で
時 間 を 指 定 す
る 。 注 意も と も と は 、 標 準 の 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/ に 書 か れ て い る 。 |