Как запустить программу с политикой SCHED_RR из командной строки?

11

По умолчанию программы работают в Linux с разделением времени (политика TS). Как запустить программу с политикой SCHED_RR в Linux из командной строки?

Спасибо за предоставление информации о команде chrt (1). Я использовал команду для запуска Firefox с политикой RR, но, как вы видите ниже, только основной поток 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);
}
samarasa
источник

Ответы:

10

Используйте chrtкоманду сchrt --rr <priority between 1-99> <command>

Пример:

chrt --rr 99 ls

Обратите внимание, что для настройки SCHED_RRтребуются права суперпользователя, поэтому вам нужно либо быть суперпользователем, либо запускать его с помощью 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. Как видно из вашего вывода, два потока имеют класс RR, так что это не только родительский поток.

Изменить 2:

Попробуйте начать процесс с chrtизменения расписания существующего pid. Похоже, что если вы перепланируете, только первый поток получит класс RR. Однако, если вы начнете с этого chrt, каждый поток получит его.

Эгиль
источник
Спасибо @Egil. Кстати, класс планирования по умолчанию - TS right. Вы можете увидеть в выводе команды ps.
Самараса
Да .. он работает таким образом. Таким образом, это не работает, если мы даем pid.
Самараса
их слишком мало -r(используется только дважды), я предлагаю использовать -rrrrrrrrrвместо них ;-P
poige
Мне не нужен root для запуска на моем конце ...
enigmaticPhysicist
@samarasa: может быть, вам нужен вариант. Из руководства:-a, --all-tasks Set or retrieve the scheduling attributes of all the tasks (threads) for a given PID.
Нарколессико
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.

Zibri
источник