5

作業中のプロジェクト用にセミポータブルスレッドクラスを作成しようとしています。スレッドの優先度を設定しようとしているときに、pthreadの世界で難問に遭遇しました。

次のコードが与えられます:

#include <stdio.h>
#include <unistd.h>
#include <sched.h>
main()
{
    printf("Valid priority range for SCHED_OTHER: %d - %d\n",
        sched_get_priority_min(SCHED_OTHER),
        sched_get_priority_max(SCHED_OTHER));
    printf("Valid priority range for SCHED_FIFO: %d - %d\n",
        sched_get_priority_min(SCHED_FIFO),
        sched_get_priority_max(SCHED_FIFO));
    printf("Valid priority range for SCHED_RR: %d - %d\n",
        sched_get_priority_min(SCHED_RR),
        sched_get_priority_max(SCHED_RR));
}

OpenBSDでは、これは以下を出力します:

Valid priority range for SCHED_OTHER: 0 - 31
Valid priority range for SCHED_FIFO: 0 - 31
Valid priority range for SCHED_RR: 0 - 31

Ubuntuではこれを生成します:

Valid priority range for SCHED_OTHER: 0 - 0
Valid priority range for SCHED_FIFO: 1 - 99
Valid priority range for SCHED_RR: 1 - 99

私の質問は、SCHED_OTHER優先順位に関するものです。私が集めることができたすべてのドキュメント(sched.h、google、SO、SE)によると、現在のプロセスのプロセス優先度を取得し、それに基づいて優先度を割り当てる必要があることを理解しています。の最小値/最大値を取得する場合を除いて、これは問題ありませんSCHED_OTHER。スケジューリングはシステムに依存するため、現在のプロセスの優先度をSCHED_OTHER取得し、Ubuntu(または私が遭遇した他のLinuxシステム)で最小/最大値を取得しようとすると、値は0〜0になります。有効な優先度範囲を設定しようとしても機能しません。ただし、SCHED_OTHER他のUNIXライクなシステム(OpenBSDなど)では有効な値を取得します。

私の主な関心事は、有効な範囲の優先度の値を取得しようとしているだけなので(ユーザーが高すぎたり低すぎたりしないようにするため)、現在のプロセスの優先度を気にせず、最小/最大のみを取得する必要がありますこれらの値のSCHED_FFSCHED_RRは、私が遭遇したさまざまなlinux / unixシステムの有効な範囲を示しているように思われるのでしょうか、それとも完全に要点を見逃しているのでしょうか。

よろしくお願いします。不明な点や誤解がある場合はお知らせください。

編集1:私の主な関心事は、プロセスの優先順位自体よりも有効な範囲を取得するための「ポータブル」な方法にあることに注意してください。ありがとう!

4

1 に答える 1

4

SCHED_OTHERに対してUbuntu(およびその他のLinuxベースのOS)で取得する優先順位の範囲は[0,0]であり、これ有効な範囲です。これは、これらの非リアルタイムプロセスのすべてが同じ「優先度」を持ち、それらの唯一の違いは「素敵な」値にあることを意味します。

詳細については、素敵なシステムコールを参照してください。OpenBSDのスケジューラーがどのように機能するかはわかりませんが、nice()syscallはPOSIXにあり、UNIXシステムでサポートされているはずです。

于 2012-05-19T09:19:53.340 に答える