Как запустить программу с политикой 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);
}
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
каждый поток получает это.
Просто добавьте этот код внутри кода потока:
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, ¶ms);
Это даст каждому потоку максимальный приоритет RR.