Linuxリアルタイムプロセスの優先順位の範囲が1〜99の場合、どちらが最高の優先順位である1または99であるかはわかりません。
「Linuxカーネルの理解」(O'Reilly)のセクション7.2.2では、1が最高の優先度であると述べています。
「すべてのリアルタイムプロセスは、1(最高の優先度)から99(最低の優先度)の範囲の値であるリアルタイムの優先度に関連付けられています。」
一方、sched_setschedulerのmanページ(RHEL 6.1)は、99が最高であると主張しています。
「リアルタイムポリシー(SCHED_FIFO、SCHED_RR)のいずれかでスケジュールされたプロセスのsched_priority値の範囲は1(低)〜99(高)です。」
最高のリアルタイム優先度はどれですか?
次のように、これを特定する実験を行いました。
process1:RT優先度= 40、CPUアフィニティ= CPU0。このプロセスは10秒間「スピン」するため、優先度の低いプロセスはCPU 0で実行されません。
process2:RT priority = 39、CPUアフィニティ= CPU0。このプロセスは、0.5秒ごとにstdoutにメッセージを出力し、その間はスリープ状態になります。各メッセージの経過時間を出力します。
PREEMPT_RTパッチを適用した2.6.33カーネルを実行しています。
実験を実行するには、あるウィンドウで(ルートとして)process2を実行し、別のウィンドウで(ルートとして)process1を開始します。その結果、process1はprocess2を横取りしているように見え、10秒間実行することはできません。
2番目の実験では、process2のRT優先度を41に変更します。この場合、process2はprocess1によってプリエンプトされたnotです。 。
この実験は、largerRT sched_setscheduler()の優先度の値がより高い優先度を持っていることを示しています。 Michael Foukarakisはsched.hから指摘しましたが、実際にはそうではありません。カーネルソースの sched.c には、
static void
__setscheduler(struct rq *rq, struct task_struct *p, int policy, int prio)
{
BUG_ON(p->se.on_rq);
p->policy = policy;
p->rt_priority = prio;
p->normal_prio = normal_prio(p);
/* we are holding p->pi_lock already */
p->prio = rt_mutex_getprio(p);
if (rt_prio(p->prio))
p->sched_class = &rt_sched_class;
else
p->sched_class = &fair_sched_class;
set_load_weight(p);
}
rt_mutex_getprio(p)は次のことを行います。
return task->normal_prio;
Normal_prio()はたまたま次のことを行います:
prio = MAX_RT_PRIO-1 - p->rt_priority; /* <===== notice! */
...
return prio;
言い換えれば、次のようになります(私自身の解釈):
p->prio = p->normal_prio = MAX_RT_PRIO - 1 - p->rt_priority
うわー!わかりにくいです!要約する:
P-> prioを使用すると、値が小さいほど値が大きくなります。
P-> rt_priorityを使用すると、値が大きいほど値は小さくなります。これは、sched_setscheduler()を使用して設定されたリアルタイムの優先順位です。
sched.h のこのコメントはかなり明確です:
/*
* Priority of a process goes from 0..MAX_PRIO-1, valid RT
* priority is 0..MAX_RT_PRIO-1, and SCHED_NORMAL/SCHED_BATCH
* tasks are in the range MAX_RT_PRIO..MAX_PRIO-1. Priority
* values are inverted: lower p->prio value means higher priority.
*
* The MAX_USER_RT_PRIO value allows the actual maximum
* RT priority to be separate from the value exported to
* user-space. This allows kernel threads to set their
* priority to a value higher than any user task. Note:
* MAX_RT_PRIO must not be smaller than MAX_USER_RT_PRIO.
*/
この部分に注意してください:
優先度の値は逆になります:低いp->prio
値は、より高い優先順位を意味します。
プログラムで設定できる最高のリアルタイム優先度を決定するには、sched_get_priority_max関数を使用します。
Linux 2.6.32では、sched_get_priority_max(SCHED_FIFO)の呼び出しは99を返します。
簡易回答
99がリアルタイム優先度の勝者になります。
PRは優先度レベルです(範囲-100〜40)。 PRが低いほど、プロセスの優先度は高くなります。
PRは次のように計算されます。
ロングアンサー
プロセスには2つのタイプがあります。normalプロセスとrealtime通常のプロセス(およびそれらのみ)、Nice次のように適用されます。
ニース
「ナイスネス」スケールは-20から19になりますが、-20は最高の優先度で、19は最低の優先度です。優先度レベルは次のように計算されます。
PR = 20 + NI
NIはニースレベルで、PRは優先レベルです。ご覧のとおり、-20は実際には0にマッピングされ、19は39にマッピングされます。
デフォルトでは、プログラムのNice値は0ビットです。rootユーザーは、次のコマンドを使用して、指定されたNice値でプログラムをランチできます。
Nice -n <Nice_value> ./myProgram
リアルタイム
さらに先へ進むことができました。 Niceプログラムの優先順位は、実際にはユーザープログラムに使用されます。 UNIX/LINUX全体の優先度には140の値の範囲がありますが、Niceの値により、プロセスは範囲の最後の部分(100から139)にマップできます。この式では、0〜99の値に到達できず、負のPRレベル(-100〜-1)に対応します。これらの値にアクセスできるようにするには、プロセスを「リアルタイム」として記述する必要があります。
LINUX環境には5つのスケジューリングポリシーがあり、次のコマンドで表示できます。
chrt -m
次のリストが表示されます。
1. SCHED_OTHER the standard round-robin time-sharing policy
2. SCHED_BATCH for "batch" style execution of processes
3. SCHED_IDLE for running very low priority background jobs.
4. SCHED_FIFO a first-in, first-out policy
5. SCHED_RR a round-robin policy
スケジューリングプロセスは、通常のスケジューリングポリシー(1〜3)とリアルタイムスケジューリングポリシー(4と5)の2つのグループに分けることができます。リアルタイムプロセスは常に通常のプロセスよりも優先されます。リアルタイムプロセスは、次のコマンドを使用して呼び出すことができます(例は、SCHED_RRポリシーを宣言する方法です)。
chrt --rr <priority between 1-99> ./myProgram
リアルタイムプロセスのPR値を取得するには、次の式が適用されます。
PR = -1-rt_prior
ここで、rt_priorは1から99までの優先順位に対応します。そのため、他のプロセスよりも高い優先順位を持つプロセスは、番号99で呼び出されます。
リアルタイムプロセスの場合、Nice値は使用されないことに注意することが重要です。
プロセスの現在の「適切さ」とPR値を確認するには、次のコマンドを実行できます。
top
次の出力が表示されます。
図では、PRとNIの値が表示されます。リアルタイム値に対応するPR値-51のプロセスに注意してください。 PR値が「rt」と記載されているプロセスもあります。この値は、実際には-100のPR値に対応します。
BATCHの非リアルタイムプロセス優先度のカウントとして40があります。その他のポリシーは、100〜139ではなく0〜39で変化します。これは、リアルタイムではないシステムのプロセスを調べることで確認できます。処理する。デフォルトでPRは20、NIcenessは0になります。プロセスのナイスネスを下げると(通常、ナイスネスが低いか負の数、プロセスが空腹になるほど)、0から-1にすると、PRiorityが20から19に低下することがわかります。これは単にプロセスをより空腹にしたり、PIDのナイスネス値を減らしてもう少し注意を引きたい場合は、優先度も低くなるため、PRIORITY数値を下げてPRIORITYを高くします。
Example:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2079 admin 10 -10 280m 31m 4032 S 9.6 0.0 21183:05 mgmtd
[[email protected] ~]# renice -n -11 2079
2079: old priority -10, new priority -11
[[email protected] ~]# top -b | grep mgmtd
2079 admin 9 -11 280m 31m 4032 S 0.0 0.0 21183:05 mgmtd
^C
この実用的な例が疑念を明確にし、もしあれば間違ったソースで単語を修正する助けになることを願っています。
通常のプロセスには100〜139の静的優先順位があるという仮定は、せいぜい揮発性であり、最悪の場合は無効です。つまり、set_schedulerでは、SCHED_OTHER/SCHED_BATCHおよびSCHED_IDLE(2.6.16の時点でtrue)を使用して、sched_priorityを0(動的優先度スケジューラーを示す)のみにすることができます。
SCHED_RRおよびSCHED_FIFOの場合、プログラム的に静的な優先順位は1〜99です。
動的スケジューラーによって内部的に使用される100-139の優先順位が表示される場合がありますが、動的優先順位を管理するためにカーネルが内部的に行うこと(高優先順位と低優先順位の意味を反転して比較や並べ替えを簡単にすること)は不透明ですユーザースペースに。
SCHED_OTHERでは、ほとんどが同じ優先度キューにプロセスを詰め込んでいることに注意してください。
アイデアは、カーネルをデバッグしやすくし、バカバカしい範囲外の間違いを避けることです。
そのため、意味を切り替える理由は、カーネル開発者が139-idx(idx> 139の場合のみ)のような数学を使用したくないということです... idx-100で数学を実行し、概念を逆にする方が良いidx <100が十分に理解されているため、低vs高の.
また、副作用は、素晴らしさが扱いやすくなることです。 100-100 <=>ニース== 0; 101-100 <=>ニース== 1;などが簡単です。負の数にもうまく折り畳まれます(静的な優先順位とは関係ありません)99-100 <=> Nice == -1 ...