1. ホーム
  2. linux

[解決済み] Linuxで最も高い優先度を持つのはどのリアルタイム優先度ですか?

2023-07-26 15:35:12

質問

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()を使用して設定されたリアルタイム優先度です。