SCHED_FIFOをSCHED_DEADLINEまで先取りできますか?

SCHED_FIFOをSCHED_DEADLINEまで先取りできますか?

マニュアルページに記載されているように:

A SCHED_FIFO thread runs until either it is blocked by an I/O
request, it is preempted by a higher priority thread, or it calls
sched_yield(2).

同じソースから:

SCHED_DEADLINE threads are the
highest priority (user controllable) threads in the system; if any
SCHED_DEADLINE thread is runnable, it will preempt any thread
scheduled under one of the other policies.

これはスレッドですrtprioSCHED_DEADLINEスレッドは99を先取りしますか?それに言及するのはやや簡単ですが、rtprio 99がシステム(watchdog、migration、posixcputimer...)で最高の優先順位になると思ったので、少し混乱しています。標準カーネルとrt_patchedカーネルについてこれを知りたいです。みんなありがとうございます。

答え1

マニュアルページが正しい。これを確認することは難しくありません。

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/sched/deadline.h#n5?h=v4.10

/*
 * SCHED_DEADLINE tasks has negative priorities, reflecting
 * the fact that any of them has higher prio than RT and
 * NORMAL/BATCH tasks.
 */

#define MAX_DL_PRIO       0

これはLinuxスケジューラ管理者が選択した方法です。あなたの興味に関連するLWNの記事の全文を読みたい場合でも、以下にLWNの説明を引用してください。この文書の長さは限られているため、あなたが経験する可能性があるすべての特定の混乱を解決することを保証することはできません。 https://lwn.net/Articles/356576/

しかし、Peter Zijlstraは、締め切りスケジュールを最も高い優先順位で実行する必要があると思います。そうしないと、ジョブが時間内に完了することを確認できません。


rtprio 99がシステムで最も高い優先順位になると思ったので、少し混乱しています(watchdog、migration、posixcputimer ...)。

Peter'sへのLWNリンク予備レビュー、これについて言及します。

絶対に最高の優先順位が必要な作業は、kstopmachineとmigrationの2つだけです。したがって、そのジョブはEDFより高く設定する必要があり、残りは重要ではありません。 :-)

この場合、移行が正確に何であるかはわかりませんが、LWNの記事ではSMPリアルタイムが難しいことを指摘しています。

リストにあるstopmachineは「だからRTではしないでください!」を意味します。ピーターはこの点を明らかにした。後で

ウォッチドッグは確かにリアルタイムプロセスよりも長い時間単位で実行され、締め切りスケジュールを使用して後で実行する時間を確保できます(下記参照)。

皮肉なことに、私はリアルタイムカーネルでタイマーの動作に関する情報を見つけるのに苦労しています。一つあるRT Wiki優先順位は言及されていますが、締め切りは言及されていません... このページは2008年に最後に編集され、PIII 400Mhz CPUを搭載したテストシステムを指定します。ピーターが元のコメントでタイマーを言及していないのも興味深いです。可能であれば、RTプロセスでclock_nanosleep()を使用することをお勧めします。 (明らかに、これはおそらくあなたが言及しているCPUTIMEクロックにはほとんど役に立ちません)。


プロセスが指定された最悪の実行時間を超えない限り、期限スケジューラは期限が満たされることを保証できます。優先順位スケジューラにはこの機能はありません。

管理者は、SCHED_FIFOプロセスの存在を条件にするのではなく、この保証を好みます。保証なしに期限を設定することはかなり異なることになります。それがどのくらい有用性を残すのかわかりません。

締め切り予約プロセスには最大帯域幅があります。これはLinuxスケジューラによって実施されます。原則として、最終実行期間が指定されたプロセスの全帯域幅と最大実行期間を調べて、優先順位付けされたプロセスに対する最悪の影響を判断できる必要があります。 POSIX スケジューリングクラス SCHED_FIFO は WCET を適用しないため、逆の場合は適用されません。

締め切りシステムはもはや静的優先順位を使用しません。代わりに、実行中の各ジョブには3つの予約パラメータのセットがあります。

  • 締め切り - 作業を完了する時間です。
  • 実行期間 - ジョブを実行する頻度。
  • WCET(ワーストケースの実行時間) - ジョブを完了するのに必要な最大CPU時間。

プロセスの「帯域幅」要件(必要なCPU比)は簡単に計算できるため、スケジューラは最初からシステムが超過購読されたかどうかを知ることができます。スケジューラは、システムで利用可能な帯域幅よりも多くの帯域幅を必要とするタスクの受け入れを拒否することができ、拒否する必要があります。重複操作を拒否することで、スケジューラは常に指定された期限内に必要なCPU時間を各プロセスに提供できます。この種の献身は、リアルタイムの開発者を幸せにします。

関連情報