名 前
sched − ス ケ ジ ュ ー リ ン グ API の 概 要
説 明
API の
概 要 (Linux 固 有 )
指 定 さ れ た ス
レ ッ ド の CPU affinity を
設 定 す る 。 (Linux 固 有 )
指 定 さ れ た ス
レ ッ ド の CPU affinity を
取 得 す る 。 sched_setattr(2)
指 定 さ れ た ス
レ ッ ド の ス ケ
ジ ュ ー リ ン グ
ポ リ シ ー と パ
ラ メ ー タ ー を
設 定 す る 。 こ
の (Linux 固 有 の ) シ
ス テ ム コ ー ル
は sched_setscheduler(2) と
sched_setparam(2) の 両 方 の
機 能 を 持 つ 。
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_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 sched_setattr(2)
を 使 っ て ス レ
ッ ド に SCHED_DEADLINE ポ
リ シ ー を 設 定
す る 際 、 Runtime,
Deadline, Period の 3 つ の
パ ラ メ ー タ ー
を 指 定 す る こ
と が で き る 。
こ れ ら の パ ラ
メ ー タ ー は 必
ず し も 上 で 述
べ た 用 語 に 対
応 し て い る わ
け で は な い 。
よ く あ る 方 法
と し て は 、 Runtime
に 平 均 計 算 時
間 (も し く は ハ
ー ド リ ア ル タ
イ ム タ ス ク の
場 合 は 最 悪 ケ
ー ス の 実 行 時
間 ) よ り も 大 き
な 値 を 、 Deadline に
相 対 デ ッ ド ラ
イ ン を 、 Period に タ
ス ク の 期 間 (period)
を 設 定 す る 。
し た が っ て 、
SCHED_DEADLINE ス ケ ジ ュ
ー リ ン グ で は
、 以 下 の よ う
に な る 。 arrival/wakeup
absolute deadline 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_BATCH:
バ ッ チ プ ロ セ
ス の ス ケ ジ ュ
ー リ ン グ SCHED_IDLE:
非 常 に 優 先 度
の 低 い ジ ョ ブ
の ス ケ ジ ュ ー
リ ン グ * 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/ に 書
か れ て い る 。
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)
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 は 0 よ り 大
き な 静 的 優 先
度 で の み 使 用
で き る 。 こ の
ポ リ シ ー で は
、 SCHED_FIFO ス レ ッ
ド が 実 行 可 能
に な っ た 場 合
、 そ の ポ リ シ
ー が SCHED_OTHER、
SCHED_BATCH、 SCHED_IDLE の
現 在 実 行 中 の
ス レ ッ ド は 直
ち に 実 行 権 を
取 り 上 げ ら れ
る 。 SCHED_FIFO は 時
分 割 の な い 単
純 な ス ケ ジ ュ
ー リ ン グ ア ル
ゴ リ ズ ム で あ
る 。 SCHED_FIFO ポ リ
シ ー で ス ケ ジ
ュ ー リ ン グ さ
れ て い る ス レ
ッ ド に は 以 下
の ル ー ル が 適
用 さ れ る :
SCHED_RR は SCHED_FIFO の 単
純 な 拡 張 で あ
る 。 上 述 さ れ
た SCHED_FIFO に 関 す
る 記 述 は 全 て
SCHED_RR に 適 用 で き
る 。 異 な る の
は そ れ ぞ れ の
ス レ ッ ド は 最
大 時 間 単 位 ま
で し か 実 行 で
き な い と い う
こ と で あ る 。
SCHED_RR ス レ ッ ド が
時 間 単 位 と 同
じ か そ れ よ り
長 い 時 間 実 行
さ れ る と 、 そ
の 優 先 度 の リ
ス ト の 最 後 に
置 か れ る 。 よ
り 高 い 優 先 度
の ス レ ッ ド に
よ っ て 置 き か
え ら れ 、 そ の
後 実 行 を 再 開
し た SCHED_RR ス レ ッ
ド は 、 そ の ラ
ウ ン ド ロ ビ ン
時 間 単 位 を 完
全 に 使 い 切 る
ま で 実 行 さ れ
る 。 そ の 時 間
単 位 の 長 さ は
sched_rr_get_interval(2) を 使 っ
て 取 得 で き る
。
| start time |
| | |
v v v
−−−−−x−−−−−−−−xooooooooooooooooo−−−−−−−−x−−−−−−−−x−−−
|<− comp. time −>|
|<−−−−−−−
relative deadline
−−−−−−>|
|<−−−−−−−−−−−−−−
period
−−−−−−−−−−−−−−−−−−−>|
| start time |
| | |
v v v
−−−−−x−−−−−−−−xooooooooooooooooo−−−−−−−−x−−−−−−−−x−−−
|<−− Runtime
−−−−−−−>|
|<−−−−−−−−−−−
Deadline
−−−−−−−−−−−>|
|<−−−−−−−−−−−−−−
Period
−−−−−−−−−−−−−−−−−−−>|
SCHED_OTHER は 静 的 優 先
度 0 で の み 使 用
で き る 。 SCHED_OTHER
は Linux 標 準 の 時 分
割 ス ケ ジ ュ ー
ラ で 、 特 別 な
リ ア ル タ イ ム
機 構 を 必 要 と
し て い な い 全
て の ス レ ッ ド
で 使 用 さ れ る
。 実 行 す る ス
レ ッ ド は 、 静
的 優 先 度 0 の リ
ス ト か ら 、 こ
の リ ス ト の 中
だ け で 決 定 さ
れ る 「 動 的 な
」 優 先 度 (dynamic priority)
に 基 い て 決 定
さ れ る 。 動 的
な 優 先 度 は
(nice(2), setpriority(2),
sched_setattr(2) に よ り 設
定 さ れ る ) nice 値 に
基 づ い て 決 定
さ れ る も の で
、 単 位 時 間 毎
に 、 ス レ ッ ド
が 実 行 可 能 だ
が 、 ス ケ ジ ュ
ー ラ に よ り 実
行 が 拒 否 さ れ
た 場 合 に イ ン
ク リ メ ン ト さ
れ る 。 こ れ に
よ り 、 全 て の
SCHED_OTHER ス レ ッ ド
で の 公 平 性 が
保 証 さ れ る 。
(Linux 2.6.16 以 降 ) SCHED_BATCH
は 静 的 優 先 度 0
で の み 使 用 で
き る 。 こ の ポ
リ シ ー は (nice 値 に
基 づ く ) 動 的 な
優 先 度 に し た
が っ て ス レ ッ
ド の ス ケ ジ ュ
ー リ ン グ が 行
わ れ る と い う
点 で 、 SCHED_OTHER に
似 て い る 。 異
な る の は 、 こ
の ポ リ シ ー で
は 、 ス レ ッ ド
が 常 に CPU に 負 荷
の か か る (CPU−intensive)
処 理 を 行 う と
、 ス ケ ジ ュ ー
ラ が 仮 定 す る
点 で あ る 。 ス
ケ ジ ュ ー ラ は
ス レ ッ ド を 呼
び 起 こ す 毎 に
そ の ス レ ッ ド
に ス ケ ジ ュ ー
リ ン グ 上 の ペ
ナ ル テ ィ を 少
し 課 し 、 そ の
結 果 、 こ の ス
レ ッ ド は ス ケ
ジ ュ ー リ ン グ
の 決 定 で 若 干
冷 遇 さ れ る よ
う に な る 。 こ
の ポ リ シ ー は
、 非 対 話 的 な
処 理 だ が そ の nice
値 を 下 げ た く
な い 処 理 や 、
(処 理 の タ ス ク
間 で ) 余 計 な タ
ス ク の 置 き 換
え の 原 因 と あ
る 対 話 的 な 処
理 な し で 確 定
的 な (deterministic) ス ケ ジ
ュ ー リ ン グ ポ
リ シ ー を 適 用
し た い 処 理 に
対 し て 有 効 で
あ る 。
(Linux 2.6.23 以 降 ) SCHED_IDLE は
静 的 優 先 度 0 で
の み 使 用 で き
る 。 こ の ポ リ
シ ー で は プ ロ
セ ス の nice 値 は ス
ケ ジ ュ ー リ ン
グ に 影 響 を 与
え な い 。 非 常
に 低 い 優 先 度
で の ジ ョ ブ の
実 行 を 目 的 と
し た も の で あ
る (非 常 に 低 い
優 先 度 と は 、
ポ リ シ ー SCHED_OTHER
か SCHED_BATCH で の nice 値
+19 よ り さ ら に 低
い 優 先 度 で あ
る )。 子 プ ロ セ
ス で の ス ケ ジ
ュ ー リ ン グ ポ
リ シ ー の リ セ
ッ ト 各 ス レ ッ
ド に は reset−on−fork
ス ケ ジ ュ ー リ
ン グ フ ラ グ が
あ る 。 こ の フ
ラ グ が セ ッ ト
さ れ る と 、 fork(2)
で 作 成 さ れ る
子 プ ロ セ ス は
特 権 ス ケ ジ ュ
ー リ ン グ ポ リ
シ ー を 継 承 し
な い 。 reset−on−fork
フ ラ グ は 以 下
の い ず れ か の
方 法 で セ ッ ト
で き る 。
*
/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) を 使 っ て
メ モ リ ー ロ ッ
ク を し な け れ
ば な ら な い 。注 意
関 連 項 目
こ の 文 書 に つ い て