OSDN Git Service

14d4a7a3d0416173260ed71faaf2d2f4d66749f5
[linuxjm/LDP_man-pages.git] / release / man7 / sched.7
1 .\" Copyright (C) 2014 Michael Kerrisk <mtk.manpages@gmail.com>
2 .\" and Copyright (C) 2014 Peter Zijlstra <peterz@infradead.org>
3 .\" and Copyright (C) 2014 Juri Lelli <juri.lelli@gmail.com>
4 .\" Various pieces from the old sched_setscheduler(2) page
5 .\"     Copyright (C) Tom Bjorkholm, Markus Kuhn & David A. Wheeler 1996-1999
6 .\"     and Copyright (C) 2007 Carsten Emde <Carsten.Emde@osadl.org>
7 .\"     and Copyright (C) 2008 Michael Kerrisk <mtk.manpages@gmail.com>
8 .\"
9 .\" %%%LICENSE_START(GPLv2+_DOC_FULL)
10 .\" This is free documentation; you can redistribute it and/or
11 .\" modify it under the terms of the GNU General Public License as
12 .\" published by the Free Software Foundation; either version 2 of
13 .\" the License, or (at your option) any later version.
14 .\"
15 .\" The GNU General Public License's references to "object code"
16 .\" and "executables" are to be interpreted as the output of any
17 .\" document formatting or typesetting system, including
18 .\" intermediate and printed output.
19 .\"
20 .\" This manual is distributed in the hope that it will be useful,
21 .\" but WITHOUT ANY WARRANTY; without even the implied warranty of
22 .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 .\" GNU General Public License for more details.
24 .\"
25 .\" You should have received a copy of the GNU General Public
26 .\" License along with this manual; if not, see
27 .\" <http://www.gnu.org/licenses/>.
28 .\" %%%LICENSE_END
29 .\"
30 .\" Worth looking at: http://rt.wiki.kernel.org/index.php
31 .\"
32 .\"*******************************************************************
33 .\"
34 .\" This file was generated with po4a. Translate the source file.
35 .\"
36 .\"*******************************************************************
37 .TH SCHED 7 2014\-10\-02 Linux "Linux Programmer's Manual"
38 .SH 名前
39 sched \- スケジューリング API の概要
40 .SH 説明
41 .SS "API の概要"
42 Linux のスケジューリング API は以下のとおりである。
43 .TP 
44 \fBsched_setscheduler\fP(2)
45 指定されたスレッドのスケジューリングポリシーとパラメーターを設定する。
46 .TP 
47 \fBsched_getscheduler\fP(2)
48 指定されたスレッドのスケジューリングポリシーを返す。
49 .TP 
50 \fBsched_setparam\fP(2)
51 指定されたスレッドのスケジューリングパラメーターを設定する。
52 .TP 
53 \fBsched_getparam\fP(2)
54 指定されたスレッドのスケジューリングパラメーターを取得する。
55 .TP 
56 \fBsched_get_priority_max\fP(2)
57 指定されたスケジューリングポリシーで利用可能な最小の優先度を返す。
58 .TP 
59 \fBsched_get_priority_min\fP(2)
60 指定されたスケジューリングポリシーで利用可能な最大の優先度を返す。
61 .TP 
62 \fBsched_rr_get_interval\fP(2)
63 「ラウンドロビン」スケジューリングポリシーでスケジューリグされるスレッドで使用される単位時間 (quantum) を取得する。
64 .TP 
65 \fBsched_yield\fP(2)
66 呼び出し元が CPU の使用権を明け渡して、 他のスレッドが実行できるようにする。
67 .TP 
68 \fBsched_setaffinity\fP(2)
69 (Linux 固有) 指定されたスレッドの CPU affinity を設定する。
70 .TP 
71 \fBsched_getaffinity\fP(2)
72 (Linux 固有) 指定されたスレッドの CPU affinity を取得する。
73 .TP 
74 \fBsched_setattr\fP(2)
75 指定されたスレッドのスケジューリングポリシーとパラメーターを設定する。 この (Linux 固有の) システムコールは
76 \fBsched_setscheduler\fP(2) と \fBsched_setparam\fP(2) の両方の機能を持つ。
77 .TP 
78 \fBsched_getattr\fP(2)
79 .\"
80 指定されたスレッドのスケジューリングポリシーとパラメーターを取得する。 この (Linux 固有の) システムコールは
81 \fBsched_getscheduler\fP(2) と \fBsched_getparam\fP(2) の両方の機能を持つ。
82 .SS "スケジューリングポリシー (scheduling policy)"
83 スケジューラ (scheduler) とはカーネルの構成要素で、 次に CPU で実行される実行可能なスレッドを決定するものである。
84 各々のスレッドには、スケジューリングポリシーと 「静的」なスケジューリング優先度 \fIsched_priority\fP が対応付けられる。
85 スケジューラは、システム上の全スレッドのスケジューリングポリシーと 静的優先度に関する知識に基づいて決定を行う。
86
87 通常のスケジューリングポリシー (\fBSCHED_OTHER\fP, \fBSCHED_IDLE\fP, \fBSCHED_BATCH\fP)
88 の下でスケジューリングされるスレッドでは、 \fIsched_priority\fP はスケジューリングの決定に使用されない
89 (\fIsched_priority\fP には 0 を指定しなければならない)。
90
91 リアルタイムスケジューリングポリシー (\fBSCHED_FIFO\fP, \fBSCHED_RR\fP)  の下でスケジューリングされるスレッドは、
92 \fIsched_priority\fP の値は 1 (最低) から 99 (最高) の範囲となる
93 (数字から分かるように、リアルタイムスレッドは常に通常のスレッドよりも 高い優先度を持つ)。 ここで注意すべきなのは、POSIX.1\-2001
94 が要求しているのは、 リアルタイムポリシーの実装において最低 32 種類の異なる優先度レベルが
95 サポートされることだけであり、いくつかのシステムではこの最低限の数の 優先度しか提供されていない、ということである。 移植性が必要なプログラムでは、
96 \fBsched_get_priority_min\fP(2)  と \fBsched_get_priority_max\fP(2)
97 を使って、あるポリシーがサポートする優先度の範囲を調べるべきである。
98
99 概念としては、 スケジューラはその \fIsched_priority\fP の値それぞれに対して 実行可能なスレッドのリストを管理している。
100 どのスレッドを次に実行するかを決定するために、 スケジューラは静的優先度の最も高い空でないリストを探して、 そのリストの先頭のスレッドを選択する。
101
102 各スレッドのスケジューリングポリシーは、 そのスレッドが同じ静的優先度を持つスレッドのリストの中のどこに挿入され、
103 このリストの中をどのように移動するかを決定する。
104
105 全てのスケジューリングはプリエンプティブ (preemptive) である: より高い優先度のスレッドが実行可能になると、現在実行中のスレッドは実行権を
106 取り上げられ (preempted)、そのスレッドの静的優先度レベルの待ちリストに 戻される。スケジューリングポリシーは同じ静的優先度を持つ実行可能な
107 スレッドのリストの中で順番のみを決定する。
108 .SS "SCHED_FIFO: ファーストインファーストアウトスケジューリング"
109 \fBSCHED_FIFO\fP は 0 より大きな静的優先度でのみ使用できる。このポリシーでは、 \fBSCHED_FIFO\fP
110 スレッドが実行可能になった場合、 そのポリシーが \fBSCHED_OTHER\fP、 \fBSCHED_BATCH\fP、 \fBSCHED_IDLE\fP の
111 現在実行中のスレッドは直ちに実行権を取り上げられる。 \fBSCHED_FIFO\fP は時分割のない単純なスケジューリングアルゴリズムである。
112 \fBSCHED_FIFO\fP ポリシーでスケジューリングされているスレッドには以下の ルールが適用される:
113 .IP * 3
114 より高い優先度の他のスレッドによって取って代わられた \fBSCHED_FIFO\fP スレッドはその優先度のリストの先頭に留まり続け、
115 より高い優先度のスレッド全てが停止 (block) した場合に実行を再開する。
116 .IP *
117 \fBSCHED_FIFO\fP スレッドが実行可能になった時、その優先度のリストの最後 に挿入される。
118 .IP *
119 .\" In 2.2.x and 2.4.x, the thread is placed at the front of the queue
120 .\" In 2.0.x, the Right Thing happened: the thread went to the back -- MTK
121 \fBsched_setscheduler\fP(2), \fBsched_setparam\fP(2), \fBsched_setattr\fP(2) は \fIpid\fP
122 で指定された \fBSCHED_FIFO\fP (または \fBSCHED_RR\fP) スレッドが 実行可能な場合、リストの最初に置く。
123 結果として、もし優先度が同じだった場合、 現在実行中のスレッドに先んじるかもしれない。 (POSIX.1\-2001
124 ではスレッドはリストの最後に行くべきと規定されている。)
125 .IP *
126 \fBsched_yield\fP(2)  を呼び出したスレッドはリストの最後に置かれる。
127 .PP
128 その他のイベントによって \fBSCHED_FIFO\fP
129 ポリシーでスケジューリングされるスレッドが同じ優先度の実行可能なスレッドの待ちリストの中を移動することはない。
130
131 \fBSCHED_FIFO\fP スレッドは I/O 要求によって停止するか、 より高い優先度のスレッドによって置きかえられるか、
132 \fBsched_yield\fP(2)  を呼び出すまで実行を続ける。
133 .SS "SCHED_RR: ラウンドロビン (round\-robin) スケジューリング"
134 .\" On Linux 2.4, the length of the RR interval is influenced
135 .\" by the process nice value -- MTK
136 .\"
137 \fBSCHED_RR\fP は \fBSCHED_FIFO\fP の単純な拡張である。 上述された
138 \fBSCHED_FIFO\fP に関する記述は全て \fBSCHED_RR\fP に 適用できる。異なるのは
139 それぞれのスレッドは最大時間単位までしか実行できない ということである。
140 \fBSCHED_RR\fP スレッドが時間単位と同じかそれより 長い時間実行されると、
141 その優先度のリストの最後に置かれる。 より高い優先度のスレッドによって
142 置きかえられ、その後実行を再開した \fBSCHED_RR\fP スレッドは、そのラウンド
143 ロビン時間単位を完全に使い切る まで実行される。その時間単位の長さは
144 \fBsched_rr_get_interval\fP(2) を使って取得できる。
145 .SS "SCHED_DEADLINE: 散発タスクモデルのデッドラインスケジューリング"
146 バージョン 3.14 以降では、 Linux はデッドラインスケジューリングポリシー (\fBSCHED_DEADLINE\fP) が提供される。
147 現在のところ、 このポリシーは GEDF (Global Earliest Deadline First) を使って CBS (Constant
148 Bandwidth Server) との組み合わせで実装されている。 このポリシーと関連する属性の設定、取得を行うには、 Linux
149 固有のシステムコール \fBsched_setattr\fP(2) と \fBsched_getattr\fP(2) を使用する必要がある。
150
151 散発タスク (sporadic task) はジョブ列を持つタスクで、 各ジョブは期間 (period) あたり多くとも 1 回だけ有効化される。
152 各ジョブには \fIrelative deadline\fP (相対デッドライン) と \fIcomputation time\fP (計算時間) がある。
153 相対デッドラインは、そのジョブがそのデッドラインより前に実行が終了すべきであることを示す。 計算時間は、このジョブを実行するのに必要な CPU
154 時間である。 新しいジョブを実行する必要が出てタスクが起こされる時点は \fIarrival time\fP (到着時刻) と呼ばれる (要求時刻
155 (request time) や解放時刻 (release time) と呼ばれることもある)。 \fIstart time\fP
156 はタスクが実行を開始する時刻である。 したがって、 \fIabsolute deadline\fP (絶対デッドライン)
157 は到着時刻に相対デッドラインを加算することで求められる。
158
159 以下の図はこれらの用語をまとめたものである。
160
161 .in +4n
162 .nf
163 arrival/wakeup                    absolute deadline
164      |    start time                    |
165      |        |                         |
166      v        v                         v
167 \-\-\-\-\-x\-\-\-\-\-\-\-\-xooooooooooooooooo\-\-\-\-\-\-\-\-x\-\-\-\-\-\-\-\-x\-\-\-
168               |<\- comp. time \->|
169      |<\-\-\-\-\-\-\- relative deadline \-\-\-\-\-\->|
170      |<\-\-\-\-\-\-\-\-\-\-\-\-\-\- period \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\->|
171 .fi
172 .in
173
174 \fBsched_setattr\fP(2) を使ってスレッドに \fBSCHED_DEADLINE\fP ポリシーを設定する際、 \fIRuntime\fP,
175 \fIDeadline\fP, \fIPeriod\fP の 3 つのパラメーターを指定することができる。
176 これらのパラメーターは必ずしも上で述べた用語に対応しているわけではない。 よくある方法としては、 Runtime に平均計算時間
177 (もしくはハードリアルタイムタスクの場合は最悪ケースの実行時間) よりも大きな値を、 Deadline に相対デッドラインを、 Period
178 にタスクの期間 (period) を設定する。 したがって、 \fBSCHED_DEADLINE\fP スケジューリングでは、 以下のようになる。
179
180 .in +4n
181 .nf
182 arrival/wakeup                    absolute deadline
183      |    start time                    |
184      |        |                         |
185      v        v                         v
186 \-\-\-\-\-x\-\-\-\-\-\-\-\-xooooooooooooooooo\-\-\-\-\-\-\-\-x\-\-\-\-\-\-\-\-x\-\-\-
187               |<\-\- Runtime \-\-\-\-\-\-\->|
188      |<\-\-\-\-\-\-\-\-\-\-\- Deadline \-\-\-\-\-\-\-\-\-\-\->|
189      |<\-\-\-\-\-\-\-\-\-\-\-\-\-\- Period \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\->|
190 .fi
191 .in
192
193 .\" FIXME It looks as though specifying sched_period as 0 means
194 .\"       "make sched_period the same as sched_deadline".
195 .\"       This needs to be documented.
196 3 つのデッドラインスケジューリングパラメーターは \fIsched_attr\fP 構造体の \fIsched_runtime\fP,
197 \fIsched_deadline\fP, \fIsched_period\fP フィールドに対応する。 これらのフィールドはナノ秒単位の値である。
198 \fIsched_period\fP に 0 が指定された場合 \fIsched_deadline\fP と同じ値になる。
199
200 カーネルでは以下の関係が成り立つことが求められる。
201
202     sched_runtime <= sched_deadline <= sched_period
203
204 .\" See __checkparam_dl in kernel/sched/core.c
205 これに加えて、 現在の実装では、 すべてのパラメーター値は少なくとも 1024 (実装の粒度である 1 マイクロ秒よりも少しだけ大きな値) で 2^63
206 よりも小さくなければならない。 これらのチェックのいずれかが失敗すると、 \fBsched_setattr\fP(2) はエラー \fBEINVAL\fP
207 で失敗する。
208
209 CBS によりタスク間の干渉がないことが保証される。 指定された Runtime を超えて実行しようとしたスレッドは絞り込まれることになる。
210
211 デッドラインスケジューリングの保証がきちんと機能するためには、 カーネルは \fBSCHEDULING\fP スレッドの集合が指定された制約条件におさまらない
212 (スケジューリングできない) 状況を防止しなければならない。 そのため、カーネルは \fBSCHED_DEADLINE\fP
213 ポリシーと属性を設定、変更する際に、受け入れチェック (admittance test) を実行する。
214 この受け入れチェックは、変更が実行可能かを計算し、もし実行できないようであれば \fBsched_setattr\fP(2) はエラー \fBEBUSY\fP
215 で失敗する。
216
217 例えば、 使用率の合計が利用可能な合計 CPU 数以下である必要がある (ただし、必ずしも十分というわけではない)。 なお、 各スレッドは最大で
218 Period あたり Runtime だけ実行されることがあるので、 そのスレッドの使用率は Runtime を Period で割ったものとなる。
219
220 スレッドが \fBSCHED_DEADLINE\fP ポリシーに受け入れられた場合に保証を実現するため、 \fBSCHED_DEADLINE\fP
221 スレッドはシステムで (ユーザーが制御可能な) 最高優先度のスレッドとなる。 いずれかの \fBSCHED_DEADLINE\fP
222 スレッドが実行可能であれば、 他のポリシーでスケジューリングされているスレッドはすべて横取りされる。
223
224 \fBSCHED_DEADLINE\fP ポリシーでスケジューリングされているスレッドが \fBfork\fP(2) を呼び出すと、 そのスレッドで
225 reset\-on\-fork フラグがセットされている場合 (下記参照) を除き、 エラー \fBEAGAIN\fP で失敗する。
226
227 .\"
228 .\" FIXME Calling sched_getparam() on a SCHED_DEADLINE thread
229 .\"       fails with EINVAL, but sched_getscheduler() succeeds.
230 .\"       Is that intended? (Why?)
231 .\"
232 \fBSCHED_DEADLINE\fP スレッドが \fBsched_yield\fP(2) を呼び出すと、 現在のジョブが CPU
233 を明け渡し、新しい期間が開始するのを待つ。
234 .SS "SCHED_OTHER: Linux のデフォルトの時分割スケジューリング"
235 .\"
236 \fBSCHED_OTHER\fP は静的優先度 0 でのみ使用できる。 \fBSCHED_OTHER\fP は Linux 標準の時分割スケジューラで、
237 特別なリアルタイム機構を必要としていない全てのスレッドで使用される。 実行するスレッドは、静的優先度 0 のリストから、このリストの中だけで
238 決定される「動的な」優先度 (dynamic priority) に基いて決定される。 動的な優先度は (\fBnice\fP(2),
239 \fBsetpriority\fP(2), \fBsched_setattr\fP(2) により設定される) nice 値に基づいて決定されるもので、
240 単位時間毎に、スレッドが実行可能だが、スケジューラにより実行が拒否された 場合にインクリメントされる。 これにより、全ての \fBSCHED_OTHER\fP
241 スレッドでの公平性が保証される。
242 .SS "SCHED_BATCH: バッチプロセスのスケジューリング"
243 (Linux 2.6.16 以降)  \fBSCHED_BATCH\fP は静的優先度 0 でのみ使用できる。 このポリシーは (nice 値に基づく)
244 動的な優先度にしたがってスレッドの スケジューリングが行われるという点で、\fBSCHED_OTHER\fP に似ている。
245 異なるのは、このポリシーでは、スレッドが常に CPU に負荷のかかる (CPU\-intensive)  処理を行うと、スケジューラが仮定する点である。
246 スケジューラはスレッドを呼び起こす毎にそのスレッドにスケジューリング上の ペナルティを少し課し、その結果、このスレッドはスケジューリングの決定で
247 若干冷遇されるようになる。
248
249 .\" The following paragraph is drawn largely from the text that
250 .\" accompanied Ingo Molnar's patch for the implementation of
251 .\" SCHED_BATCH.
252 .\" commit b0a9499c3dd50d333e2aedb7e894873c58da3785
253 .\"
254 このポリシーは、非対話的な処理だがその nice 値を下げたくない処理や、 (処理のタスク間で) 余計なタスクの置き換えの原因とある対話的な処理なしで
255 確定的な (deterministic) スケジューリングポリシーを適用したい処理に 対して有効である。
256 .SS "SCHED_IDLE: 非常に優先度の低いジョブのスケジューリング"
257 (Linux 2.6.23 以降)  \fBSCHED_IDLE\fP は静的優先度 0 でのみ使用できる。 このポリシーではプロセスの nice
258 値はスケジューリングに影響を与えない。
259
260 .\"
261 非常に低い優先度でのジョブの実行を目的としたものである (非常に低い優先度とは、ポリシー \fBSCHED_OTHER\fP か \fBSCHED_BATCH\fP
262 での nice 値 +19 よりさらに低い優先度である)。
263 .SS 子プロセスでのスケジューリングポリシーのリセット
264 各スレッドには reset\-on\-fork スケジューリングフラグがある。 このフラグがセットされると、 \fBfork\fP(2)
265 で作成される子プロセスは特権スケジューリングポリシーを継承しない。 reset\-on\-fork フラグは以下のいずれかの方法でセットできる。
266 .IP * 3
267 \fBsched_setscheduler\fP(2) を呼び出す際に \fBSCHED_RESET_ON_FORK\fP フラグを \fIpolicy\fP
268 引き数に論理和で指定する (Linux 2.6.32 以降)。
269 .IP *
270 \fBsched_setattr\fP(2) を呼び出し際に \fIattr.sched_flags\fP に
271 \fBSCHED_FLAG_RESET_ON_FORK\fP フラグを指定する。
272 .PP
273 これらの 2 つの API で使用される定数は名前が違っている点に注意すること。 同様に reset\-on\-fork フラグの状態は
274 \fBsched_getscheduler\fP(2) と \fBsched_getattr\fP(2) を使って取得できる。
275
276 reset\-on\-fork 機能はメディア再生アプリケーションでの利用を意図したものである。 複数の子プロセスを作成することで、 アプリケーションは
277 \fBRLIMIT_RTTIME\fP リソース上限 (\fBgetrlimit\fP(2) を参照) を避けることができる。
278
279 より正確には、 reset\-on\-fork フラグがセットされた場合、それ以降に作成される子プロセスに以下のルールが適用される。
280 .IP * 3
281 呼び出したスレッドのスケジューリングポリシーが \fBSCHED_FIFO\fP か \fBSCHED_RR\fP の場合、子プロセスのポリシーは
282 \fBSCHED_OTHER\fP にリセットされる。
283 .IP *
284 子プロセスが負の nice 値を持っている場合、子プロセスの nice 値は 0 にリセットされる。
285 .PP
286 .\"
287 一度 reset\-on\-fork フラグが有効にされた後は、このフラグをリセットできるのは、スレッドが \fBCAP_SYS_NICE\fP
288 ケーパビリティを持つ場合だけである。このフラグは \fBfork\fP(2) で作成された子プロセスでは無効になる。
289 .SS 特権とリソース制限
290 2.6.12 より前のバージョンの Linux カーネルでは、 特権スレッド (\fBCAP_SYS_NICE\fP ケーパビリティを持つスレッド) だけが
291 0 以外の静的優先度を設定する (すなわち、リアルタイムスケジューリングポリシーを設定する) ことができる。 非特権スレッドができる変更は
292 \fBSCHED_OTHER\fP ポリシーを設定することだけであり、さらに、 この変更を行えるのは、 呼び出し元の実効ユーザ ID
293 がポリシーの変更対象スレッド (\fIpid\fP で指定されたスレッド) の実ユーザ ID か実効ユーザ ID と 一致する場合だけである。
294
295 \fBSCHED_DEADLINE\fP ポリシーを設定、変更するには、スレッドが特権 (\fBCAP_SYS_NICE\fP) を持っていなければならない。
296
297 Linux 2.6.12 以降では、リソース制限 \fBRLIMIT_RTPRIO\fP が定義されており、 スケジューリングポリシーが
298 \fBSCHED_RR\fP と \fBSCHED_FIFO\fP の場合の、非特権スレッドの静的優先度の上限を定めている。
299 スケジューリングポリシーと優先度を変更する際のルールは以下の通りである。
300 .IP * 3
301 非特権スレッドに 0 以外の \fBRLIMIT_RTPRIO\fP ソフトリミットが設定されている場合、
302 非特権スレッドはそのスレッドのスケジューリングポリシーと優先度を 変更できるが、優先度を現在の自身の優先度と \fBRLIMIT_RTPRIO\fP
303 ソフトリミットの大きい方よりも高い値に設定できないという制限が課される。
304 .IP *
305 \fBRLIMIT_RTPRIO\fP ソフトリミットが 0 の場合、優先度を下げるか、 リアルタイムでないポリシーへ切り替えるかの変更だけが許可される。
306 .IP *
307 ある非特権スレッドが別のスレッドに対してこれらの変更を行う際にも、 同じルールが適用される。変更を行えるのは、変更を行おうとするスレッド の実効ユーザ
308 ID が変更対象のスレッドの実ユーザ ID か実効ユーザ ID と 一致している場合に限られる。
309 .IP *
310 .\" commit c02aa73b1d18e43cfd79c2f193b225e84ca497c8
311 \fBSCHED_IDLE\fP ポリシーの場合には特別なルールが適用される。 2.6.39 より前の Linux
312 カーネルでは、このポリシーで動作する非特権スレッドは、 \fBRLIMIT_RTPRIO\fP
313 リソース上限の値に関わらず、自分のポリシーを変更することができない。 2.6.39 以降の Linux カーネルでは、非特権スレッドは、自分の nice
314 値が \fBRLIMIT_NICE\fP リソース上限 (\fBgetrlimit\fP(2) 参照)
315 で許可された範囲である限りは、自分のスケジューリングポリシーを \fBSCHED_BATCH\fP か \fBSCHED_NORMAL\fP
316 ポリシーに切り替えることができる。
317 .PP
318 特権スレッド (\fBCAP_SYS_NICE\fP ケーパビリティを持つスレッド) の場合、 \fBRLIMIT_RTPRIO\fP の制限は無視される;
319 古いカーネルと同じように、スケジューリングポリシーと優先度に対し 任意の変更を行うことができる。 \fBRLIMIT_RTPRIO\fP
320 に関するもっと詳しい情報は \fBgetrlimit\fP(2)  を参照のこと。
321 .SS "リアルタイムプロセスとデッドラインプロセスの CPU 使用量を制限する"
322 \fBSCHED_FIFO\fP, \fBSCHED_RR\fP, \fBSCHED_DEADLINE\fP でスケジューリングされる
323 スレッドが停止せずに無限ループに陥ると、 他の全てのより低い優先度のスレッドを永久に停止 (block) させてしまう。 Linux 2.6.25
324 より前では、 リアルタイムプロセスが暴走してしまい、システムが止まってしまうのを防止する唯一の方法は、 (コンソールで)
325 シェルをテスト対象のアプリケーションよりも高い静的優先度で実行することだけであった。 これによって期待通りに停止したり終了したりしないリアルタイム
326 アプリケーションを緊急終了させることが可能になる。
327
328 Linux 2.6.25 以降では、 暴走したリアルタイムプロセスやデッドラインプロセスを扱う別の方法が提供されている。 一つは
329 \fBRLIMIT_RTTIME\fP リソース上限を使ってリアルタイムプロセスが消費できる CPU 時間の上限を設定する方法である。 詳細は
330 \fBgetrlimit\fP(2) を参照。
331
332 Linux 2.6.25 以降では、 2 つの \fI/proc\fP ファイルを使って、リアルタイムでないプロセスが使用できる CPU
333 時間を一定量予約することができる。 この方法で CPU 時間をいくらか予約しておくことで、 CPU 時間が (例えば) root
334 シェルに割り当てられ、このシェルから暴走したプロセスを殺すことができる。 これらのファイルでは両方ともマイクロ秒で時間を指定する。
335 .TP 
336 \fI/proc/sys/kernel/sched_rt_period_us\fP
337 このファイルは、 CPU 時間 100% にあたるスケジューリング間隔を指定する。 このファイルの値として 1 から \fBINT_MAX\fP
338 を指定できる。 この値は実際の時間としては 1 マイクロ秒から約 35 分に相当する。 このファイルのデフォルト値は 1,000,000 (1 秒)
339 である。
340 .TP 
341 \fI/proc/sys/kernel/sched_rt_runtime_us\fP
342 このファイルの値は、 システム上のリアルタイムスケジューリングやデッドラインスケジューリングの全プロセスが使用できる「期間」を指定する。
343 このファイルの値として \-1 から \fBINT_MAX\fP\-1 を指定できる。 \-1 を指定すると、実行時間 (runtime) はスケジューリング間隔
344 (period) と同じになる。 つまり、 CPU 時間はリアルタイムでないプロセスには確保されない (カーネル 2.6.25 より前の Linux
345 の動作である)。 このファイルのデフォルト値は 950,000 (0.95 秒) である。 これは CPU 時間の 5%
346 がリアルタイムやデッドラインスケジューリングポリシー以外で動作するプロセスに確保されるという意味する。
347 .PP
348 .SS "応答時間 (response time)"
349 .\" as described in
350 .\" .BR request_irq (9).
351 I/O 待ちで停止したより高い優先度のスレッドは再びスケジューリングされる 前にいくらかの応答時間がかかる。デバイスドライバーを書く場合には "slow
352 interrupt" 割り込みハンドラーを使用することで この応答時間を劇的に減少させることができる。
353 .SS その他
354 子プロセスは \fBfork\fP(2)  の際に親プロセスのスケジューリングポリシーとパラメータを継承する。 \fBexecve\fP(2)
355 の前後で、スケジューリングポリシーとパラメータは保持される。
356
357 リアルタイムプロセスは大抵、ページングの待ち時間を避けるために \fBmlock\fP(2)  や \fBmlockall\fP(2)
358 を使ってメモリロックをしなければならない。
359 .SH 注意
360 .PP
361 もともとは、標準の Linux は一般目的のオペレーティングシステムとして 設計されており、バックグラウンドプロセスや対話的アプリケーション、
362 リアルタイム性の要求が厳しくないリアルタイムアプリケーション (普通はタイミングの応答期限 (deadline) を満たす必要があるアプリケーション)
363 を扱うことができた。 Linux カーネル 2.6 では、 カーネルのプリエンプション (タスクの置き換え) が可能であり、 新たに導入された O(1)
364 スケジューラにより、 アクティブなタスクの数に関わらずスケジューリングに必要な時間は 固定で確定的 (deterministic)
365 であることが保証されている。 それにも関わらず、カーネル 2.6.17 までは 真のリアルタイムコンピューティングは実現できなかった。
366 .SS "本流の Linux カーネルでのリアルタイム機能"
367 .\" FIXME . Probably this text will need some minor tweaking
368 .\" by about the time of 2.6.30; ask Carsten Emde about this then.
369 カーネル 2.6.18 から現在まで、 Linux は徐々にリアルタイム機能を備えつつ
370 あるが、 これらの機能のほとんどは、 Ingo Molnar, Thomas Gleixner,
371 Steven Rostedt らによって開発された、 以前の \fIrealtime\-preempt\fP パッチ
372 からのものである。 これらのパッチが本流のカーネルに完全にマージされるま
373 では (マージの完了はカーネル 2.6.30 あたりの予定)、 最高のリアルタイム
374 性能を達成するには realtime\-preempt パッチを 組み込まなければならない。
375 これらのパッチは
376 .in +4n
377 .nf
378
379 patch\-\fIkernelversion\fP\-rt\fIpatchversion\fP
380 .fi
381 .in
382 .PP
383 という名前で、
384 .UR http://www.kernel.org\:/pub\:/linux\:/kernel\:/projects\:/rt/
385 .UE
386 からダウンロードできる。
387
388 このパッチが適用されず、かつパッチの内容の本流のカーネルへのマージが 完了するまでは、カーネルの設定では \fBCONFIG_PREEMPT_NONE\fP,
389 \fBCONFIG_PREEMPT_VOLUNTARY\fP, \fBCONFIG_PREEMPT_DESKTOP\fP の 3つのプリエンプションクラス
390 (preemption class) だけが提供される。 これらのクラスでは、最悪の場合のスケジューリング遅延がそれぞれ
391 全く減らない、いくらか減る、かなり減る。
392
393 パッチが適用された場合、またはパッチの内容の本流のカーネルへのマージが 完了した後では、上記に加えて設定項目として
394 \fBCONFIG_PREEMPT_RT\fP が利用可能になる。この項目を選択すると、 Linux は通常のリアルタイムオペレーティングシステムに変身する。
395 この場合には、 FIFO と RR のスケジューリングポリシーは、 真のリアルタイム優先度を持つスレッドを最悪の場合のスケジューリング遅延が
396 最小となる環境で動作させるために使われることになる。
397 .SH 関連項目
398 .ad l
399 .nh
400 \fBchrt\fP(1), \fBtaskset\fP(1), \fBgetpriority\fP(2), \fBmlock\fP(2), \fBmlockall\fP(2),
401 \fBmunlock\fP(2), \fBmunlockall\fP(2), \fBnice\fP(2), \fBsched_get_priority_max\fP(2),
402 \fBsched_get_priority_min\fP(2), \fBsched_getscheduler\fP(2),
403 \fBsched_getaffinity\fP(2), \fBsched_getparam\fP(2), \fBsched_rr_get_interval\fP(2),
404 \fBsched_setaffinity\fP(2), \fBsched_setscheduler\fP(2), \fBsched_setparam\fP(2),
405 \fBsched_yield\fP(2), \fBsetpriority\fP(2), \fBpthread_getaffinity_np\fP(3),
406 \fBpthread_setaffinity_np\fP(3), \fBsched_getcpu\fP(3), \fBcapabilities\fP(7),
407 \fBcpuset\fP(7)
408 .ad
409 .PP
410 \fIProgramming for the real world \- POSIX.4\fP by Bill O. Gallmeister, O'Reilly
411 & Associates, Inc., ISBN 1\-56592\-074\-0.
412 .PP
413 Linux カーネルソースのファイル \fIDocumentation/scheduler/sched\-deadline.txt\fP,
414 \fIDocumentation/scheduler/sched\-rt\-group.txt\fP,
415 \fIDocumentation/scheduler/sched\-design\-CFS.txt\fP,
416 \fIDocumentation/scheduler/sched\-nice\-design.txt\fP
417 .SH この文書について
418 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.78 の一部
419 である。プロジェクトの説明とバグ報告に関する情報は
420 http://www.kernel.org/doc/man\-pages/ に書かれている。