Як запустити програму з політикою SCHED_RR з командного рядка?


11

За замовчуванням програми запускаються з обміном часу (TS політика) в Linux. Як запустити програму з політикою 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);
}

Відповіді:


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. Як видно з результатів, два потоки мають клас RR, тому це не тільки батьківський потік.

Редагувати 2:

Спробуйте запустити процес, chrtа не перепланувати існуючий під. Здається, що якщо ви перекладете, тільки перший потік отримує клас RR. Однак, якщо ви починаєте це з chrtкожної нитки.


Дякую @Egil До речі, клас планування за замовчуванням - це право. Ви можете бачити на виході команди ps.
samarasa

Так .. це працює таким чином. Так, це не працює, якщо ми дамо під.
samarasa

їх занадто мало -r(використовується лише два рази), я пропоную використовувати -rrrrrrrrrзамість цього ;-P
poige

Йому не потрібно було викорінювати корінь ...
загадковийфізик

@samarasa: можливо, варіант є тим, що вам потрібно. З посібника:-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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.