14

組み込みシステム (glibc 2.6.1 を使用する ARM プロセッサ上の Linux カーネル 2.6.28) で、複数のスレッドで構成されるアプリケーションを実行しています。これらのスレッドの 1 つが他のスレッドよりも多くの CPU 時間を取得したいと考えています。

優先順位を設定するための 1 つのオプションは、 \ (または\ )と共にpthread\を使用することですが、これはスレッドに非常に多くの CPU を与えます (スレッドがスリープしない限り、まだ を使用している仲間のスレッドからすべての CPU を消費します)。_setschedparamSCHED_RRSCHED_FIFOSCHED_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) でスレッドの適切なレベルがどのように処理されるかについて、ここに誰か説明がありますか? そして、すでに実行中のスレッドのナイスレベルを変更するにはどうすればよいでしょうか?

4

1 に答える 1

7

ええと、この質問を投稿したら、突然自分の間違いに気づきました-メインスレッドから関数を呼び出してナイスレベルを設定したので、もちろんすべて同じスレッドIDを持っています(メインスレッドのコンテキストで実行されるため) . DOH!!!!

正しい tid を使用すると、すべて正常に動作します。

この質問を削除するにはどうすればよいですか?

于 2009-05-23T21:56:21.607 に答える