Программами по умолчанию, запущенными с Разделением по времени (политика 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);
}
Используйте 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.