コマンドラインからSCHED_RRポリシーを使用してプログラムを実行する方法


11

デフォルトでは、プログラムはLinuxでタイムシェアリング(TSポリシー)で実行されます。LinuxでコマンドラインからSCHED_RRポリシーを使用してプログラムを実行する方法

chrt(1)コマンドに関する情報を提供してくれてありがとう。このコマンドを使用してRRポリシーでFirefoxを実行しましたが、以下に示すように、FirefoxのメインスレッドのみがRRポリシーで実行されます。Firefoxの他のすべてのスレッドをRRポリシーでも実行する方法を教えてください。

$ ps -Lo pid,tid,class 2051
  PID   TID CLS
 2051  2051 RR
 2051  2055 TS
 2051  2056 TS
 2051  2057 TS
 2051  2058 TS
 2051  2059 TS
 2051  2060 TS
 2051  2061 TS
 2051  2063 TS
 2051  2067 TS
 2051  2068 TS
 2051  2069 TS
 2051  2070 TS
 2051  2072 TS
 2051  2073 TS
 2051  2074 TS
 2051  2075 TS
 2051  2077 TS
 2051  2078 TS
 2051  2080 TS
 2051  2356 RR
 2051  2386 TS
 2051  2387 TS

編集:次の単純なpthreadsプログラムを実行し、上記のようにテストしました。残念ながら、chrtコマンドはメインスレッドのクラスのみを変更します。下記を参照してください。

$ ps -Lo pid,tid,class 3552
  PID   TID CLS
 3552  3552 TS
 3552  3553 TS
 3552  3554 TS
 3552  3555 TS
 3552  3556 TS
 3552  3557 TS

$ sudo chrt --rr -p 30 3552
 ...
$ ps -Lo pid,tid,class 3552
  PID   TID CLS
 3552  3552 RR
 3552  3553 TS
 3552  3554 TS
 3552  3555 TS
 3552  3556 TS
 3552  3557 TS

----プログラム----

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   long k = 1;
   long a[10000];
   int i = 1;
  long b[10000];

   for (k = 0; k < 400000000; k++) {
        if (i == 9999) {
       i = 1;   
    } 
    a[i] = ((k + i) * (k - i))/2;
    a[i] = k/2;
        b[i] = i * 20;
    b[i] = a[i] - b[i];
        i++;
    int j = 0;
    for (j = 0; j < i; j++) {
        k = j - i;  
    } 
     } 

   pthread_exit(NULL);

}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

回答:


10

次のchrtコマンドを使用しますchrt --rr <priority between 1-99> <command>

例:

chrt --rr 99 ls

設定にSCHED_RRはルート権限が必要なので、rootになるか、sudoで実行する必要があることに注意してください。

chrt実行中のプロセスにリアルタイムの優先度を与えるためにも使用できます。

chrt -p --rr <priority between 1-99> <pid>

同じコマンドが他のスケジューリングクラスにも適用されますが、-rrの代わりに異なるパラメーターが使用されます。

Scheduling policies:
  -b | --batch         set policy to SCHED_BATCH
  -f | --fifo          set policy to SCHED_FIFO
  -i | --idle          set policy to SCHED_IDLE
  -o | --other         set policy to SCHED_OTHER
  -r | --rr            set policy to SCHED_RR (default)

編集:

Firefoxの場合、Firefoxに固有である必要があります。私が自分で書いたマルチスレッドアプリケーションでは、すべてのスレッドがRRクラスを保持しています。出力に見られるように、2つのスレッドにはクラスRRがあるため、親スレッドだけではありません。

編集2:

chrt既存のPIDを再スケジュールする代わりに、プロセスを開始してみてください。再スケジュールすると、最初のスレッドのみがRRクラスを取得するようです。ただし、で開始するとchrt、すべてのスレッドが取得します。


@Egilに感謝します。ちなみに、デフォルトのスケジューリングクラスはTS rightです。psコマンドの出力で確認できます。
サマラサ

うん..この方法で動作します。どうやら、pidを与えると機能しません。
サマラサ

少なすぎる-r(2回のみ使用)、-rrrrrrrrr代わりに使用することをお勧めします;-P
poige

それは...私の側で実行するようにルートを必要としなかった
enigmaticPhysicist

@samarasa:多分-aオプションが必要です。マニュアルから:-a, --all-tasks Set or retrieve the scheduling attributes of all the tasks (threads) for a given PID.
Narcolessico

0

このコードをスレッドコード内に追加するだけです。

  pthread_t this_thread = pthread_self ();

  struct sched_param params;

  params.sched_priority = sched_get_priority_max (SCHED_RR);

  pthread_setschedparam (this_thread, SCHED_RR, &params);

これにより、各スレッドに最大のRR優先度が与えられます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.