7

2 つのスレッドを作成しました。デフォルトでは、0pthread_getschedparam を使用して確認できる優先度があり、それぞれの優先度を上げようとし2ます3。しかし、やろうとするとエラーが発生します

     error setting priority for T1: (1), Operation not permitted
     error setting priority for T2: (1), Operation not permitted 

のスケジューリング ポリシーを使用SCHED_RRしました

       int sched = SCHED_RR;

そして、これを実行しました:-

   if (pthread_setschedparam(t1, sched, &t1_param) != 0) 
  {
     std::cout << "error setting priority for T1: (" << errno << "), " << 
     strerror(errno) << std::endl;
  }

優先度がSCHED_RRの制限内1にあるため、スレッドの優先度を変更できない理由は何ですか。99

4

4 に答える 4

12

免責事項: 私は Linux セキュリティの専門家ではありません。次のアドバイスは、コンピュータを危険にさらしたり、損傷を与えたりする可能性があります。

Linux の最近のバージョンでは、RLIMIT_RTPRIO使用できるリアルタイムの最大優先度を指定するリソース制限があります。これはシェルから確認できます。

> ulimit -r
0

ulimit私のバージョンの Ubuntu (そしておそらくあなたのバージョンも) では、0 のハード リミットもあるため、単純に使用したりsetrlimit、これを上げたりすることはできません。ハード制限を上げる 1 つの方法は、次の/etc/security/limits.confように行を追加することです (ユーザー名に置き換え<username>ます)。

<username> hard rtprio 99

ulimit次に、(シェルから) またはsetrlimit(プログラムから) を使用して、ソフト制限を必要な優先度に設定できるはずです。limits.confまたは、 に 2 行目を追加して、 に置き換えhardて、自動的に設定することもできますsoft

> ulimit -Hr # show hard limit
99
> ulimit -r
0
> ulimit -Sr 1 # set soft limit
> ulimit -r
1

リアルタイムの優先順位でプログラムを実行する場合は注意してください。不正な動作を開始すると、システムが停止する可能性があります。

于 2012-05-22T16:03:26.207 に答える
2

説明については、この記事を参照してください。

デフォルトでは、Linux のユーザー タスクにはスケジューリング ポリシーがありますSCHED_OTHER。これをリアルタイム ポリシーに変更するには (つまりSCHED_RR、実行しようとしているように)、root になる必要があります。これを確認するには、プログラムをルートとして実行してみてください。

(また、この記事は少し古くなっていることに注意してください - Linux 2.2。これを調べて、新しいカーネルで動作が変更されたかどうかを確認することをお勧めします)

于 2012-05-22T15:33:42.227 に答える
0

で試すことができますSCHED_BATCHか?

上記はルート権限を必要としない場合があります

于 2012-05-22T15:31:00.850 に答える