Como executar um programa com a política SCHED_RR na linha de comando?

11

Por padrão, os programas são executados com o Time Sharing (política de TS) no Linux. Como executar um programa com a política SCHED_RR no Linux a partir da linha de comando?

Obrigado por fornecer informações sobre o comando chrt (1). Eu usei o comando para executar o Firefox com a política RR, mas como você vê abaixo, apenas o thread principal do Firefox é executado com a política RR. Você poderia me dizer como executar todos os outros threads do Firefox também com a política 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

Edit: Eu executei o seguinte programa pthreads simples e testei como o acima. Infelizmente, o comando chrt altera apenas a classe do thread principal. Por favor veja abaixo.

$ 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

---- Programa----

#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
fonte

Respostas:

10

Use o chrtcomando comchrt --rr <priority between 1-99> <command>

Exemplo:

chrt --rr 99 ls

Observe que a configuração SCHED_RRrequer permissões de root, então você precisa ser root ou executá-lo com o sudo.

Você também pode usar chrtpara dar prioridade ao processo em tempo real:

chrt -p --rr <priority between 1-99> <pid>

Os mesmos comandos também se aplicam a outras classes de agendamento, embora com um parâmetro diferente em vez de -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)

Editar:

No caso do Firefox, ele deve ser específico para o Firefox. Em um aplicativo multithread que eu mesmo escrevi, todos os threads mantêm a classe RR. Como visto na sua saída, dois threads têm classe RR, portanto, não é apenas o thread pai.

Edição 2:

Tente iniciar o processo em chrtvez de reagendar um pid existente. Parece que se você reagendar, apenas o primeiro thread obtém a classe RR. No entanto, se você iniciá-lo chrt, todos os threads o receberão.

Egil
fonte
Obrigado @Egil. A propósito, a classe de agendamento padrão é TS correta. Você pode ver na saída do comando ps.
precisa
Sim ... está trabalhando dessa maneira. De alguma forma, não está funcionando se dermos pid.
precisa
lá está muito poucos -r(usado somente duas vezes), eu sugiro usar -rrrrrrrrrem vez ;-P
poige
Ele não precisava de raiz para executar no meu fim ...
enigmaticPhysicist
@samarasa: talvez uma opção seja o que você precisa. Do manual:-a, --all-tasks Set or retrieve the scheduling attributes of all the tasks (threads) for a given PID.
Narcolessico 02/02
0

Basta adicionar este código dentro do código da thread:

  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);

Isso dará a cada thread a prioridade máxima de RR.

Zibri
fonte