組み込みシステム (glibc 2.6.1 を使用する ARM プロセッサ上の Linux カーネル 2.6.28) で、複数のスレッドで構成されるアプリケーションを実行しています。これらのスレッドの 1 つが他のスレッドよりも多くの CPU 時間を取得したいと考えています。
優先順位を設定するための 1 つのオプションは、 \ (または\ )と共にpthread
\を使用することですが、これはスレッドに非常に多くの CPU を与えます (スレッドがスリープしない限り、まだ を使用している仲間のスレッドからすべての CPU を消費します)。_setschedparam
SCHED
_RR
SCHED
_FIFO
SCHED_OTHER
もう 1 つのオプションは、スレッドのナイス レベルを設定することです。ただし、これはまさに私が探していたものですが (スレッドはもう少し CPU を取得しますが、他のスレッドを枯渇させることはできません)、正しく動作させることはできません。マニュアルページによると、「スレッドは共通のナイス値を共有していません」。これは、同じプロセスで個々のナイス値を異なるスレッドに設定できると解釈します。
これが私のコードです:
pid_t tid;
tid = syscall(SYS_gettid);
int ret = setpriority(PRIO_PROCESS, tid, priority);
ただし、tid はすべてのスレッドで同じようです。また、スレッドの個々のナイス レベルを設定しても、 を呼び出したときに、すべてのスレッドで設定された最新のナイス レベルが返されますgetpriority
。パフォーマンスからすると、これは一貫しています (つまり、同じタスクでスレッド A とスレッド B を実行し、次に A を -19 に設定し、B を 19 に設定すると、両方がほぼ同時に終了します)。
ただし、スレッド A を実行し、次にスレッドを -19 に設定し、次に B を実行し、+19 に設定すると、B がフル パワーで実行されます (A よりもはるかに早く終了します)。
そのため、スレッドは実行時に設定されたナイス レベルを使用し、後で変更する方法はないようです。
私は、より多くの情報やあらゆる種類の確認を求めて狂ったようにグーグルで検索しましたが、これまでに見つけたものはかなり曖昧です. Linux (2.6.28、glibc 2.6.1) でスレッドの適切なレベルがどのように処理されるかについて、ここに誰か説明がありますか? そして、すでに実行中のスレッドのナイスレベルを変更するにはどうすればよいでしょうか?