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

Программами по умолчанию, запущенными с Разделением по времени (политика 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);
}
11
задан 30 June 2011 в 11:42

2 ответа

Используйте 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, каждый поток получает его.

10
ответ дан 23 November 2019 в 04:07

Просто добавьте этот код в коде потока:

  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.

0
ответ дан 23 November 2019 в 04:07

Другие вопросы по тегам:

Похожие вопросы: