[解決済み] Linuxで最も高い優先度を持つのはどのリアルタイム優先度ですか?
質問
Linux のリアルタイムプロセスの優先度範囲 1 ~ 99 において、1 と 99 のどちらが高い優先度なのかが不明です。
"Understanding the Linux Kernel" (O'Reilly) のセクション 7.2.2 では、1 が最高優先度であり、通常のプロセスが 100 から 139 の静的優先度を持ち、100 が最高優先度と考えると理にかなっている、と述べています。
すべてのリアルタイム プロセスにはリアルタイム優先度が関連付けられており、これは 1 (最高) から 99 (最低) までの範囲の値です。 から 99 (最低の優先度) までの値です。
一方、sched_setscheduler man ページ (RHEL 6.1) では、99 が最高であると主張されています。
リアルタイムポリシー(SCHED_FIFO, SCHED_RR)の下でスケジュールされたプロセスは は、1 (low) から 99 (high) までの範囲で sched_priority 値を持ちます。
最も高いリアルタイム優先度はどれですか?
どのように解決するのですか?
私はこれを突き止めるために、次のような実験をしました。
-
プロセス 1。このプロセスは 10 秒間スピンし、CPU 0 上でより低い優先順位のプロセスを実行させないようにします。
-
プロセス 2。このプロセスは 0.5 秒ごとに標準出力にメッセージを出力し、その間はスリープします。 各メッセージで経過時間を出力します。
私は PREEMPT_RT パッチを適用した 2.6.33 カーネルを使用しています。
実験を実行するために、私は、1 つのウィンドウで (root として) process2 を実行し、それから別のウィンドウで (root として) process1 を開始します。 その結果、process1 が process2 を先取りしているように見え、10 秒間完全に実行することができません。
2 番目の実験では、process2 の RT 優先度を 41 に変更しました。 この場合、process2 は ではなく プロセス1によって先制されることはありません。
この実験では より大きな sched_setscheduler() の RT 優先度値はより高い優先度を持つことがわかります。 これは、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()を使用して設定されたリアルタイム優先度です。
関連
-
deepin20のサブネットマスクはどこですか?deepinのサブネットマスクを表示するためのヒント
-
deepin20のファイルを共有する方法を教えてください。Windowsでdeepinファイルを共有するためのヒント
-
Vmware 16仮想マシンを開けない場合、ファイルをローカルにコピーする方法は?
-
Linux Mintシステムでプログラムをアンインストールするには? Linux で不要なアプリケーションをアンインストールするためのヒント
-
floor'への未定義の参照/`&'への未定義の参照
-
[解決済み] Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
-
[解決済み] find .コマンドでディレクトリを除外する方法
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] アプリケーションやプロセスの実際のメモリ使用量を測定するにはどうすればよいですか?
-
[解決済み] Linux, Bashで、現在の時刻をEpochからの秒数で取得する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Linux Mint システムの背景画像を変更する方法は? Linuxでデスクトップの背景を変更するためのヒント
-
makeの低レベルエラー:セパレータストップがない
-
sudo が sudo として表示される: setuid root である必要がある
-
リクエスト・エンティティが大きすぎる問題の解決策
-
[解決済み] ビーコン待ちでハングアップしたリーバー
-
[解決済み] WindowsからLinuxへのscpにputtyを使用する
-
[解決済み] すべてのディレクトリとサブディレクトリを再帰的にgrepするにはどうしたらいいですか?
-
[解決済み] 複数のPDFファイルを1つのPDFに結合/変換する【終了】。
-
[解決済み] どのバージョンのPostgreSQLを使用していますか?
-
[解決済み] エクスポートあり/なしの変数の定義