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

6

Por padrão, os programas são executados com o Time Sharing (TS) no Linux. Como executar um programa com a diretiva 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 de RR, mas como você vê abaixo, apenas o segmento principal do Firefox é executado com a política de RR. Você poderia me dizer como executar todos os outros threads do Firefox também com a política de 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

Editar: Eu corri o seguinte programa pthreads simples e testado como o acima. Infelizmente, o comando chrt apenas altera 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);
}
    
por samarasa 30.06.2011 / 18:10

1 resposta

9

Use o comando chrt com chrt --rr <priority between 1-99> <command>

Exemplo:

chrt --rr 99 ls

Note que definir SCHED_RR requer permissões de root, então você precisa ser root ou executá-lo com sudo.

Você também pode usar chrt para fornecer uma prioridade em tempo real ao processo em execução:

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

Os mesmos comandos 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, deve ser importante para o Firefox. Em um aplicativo multithreaded eu escrevi a mim mesmo, todos os threads mantêm a classe RR. Como visto em sua saída, dois threads têm classe RR, então não é apenas o thread pai.

Editar 2:

Tente iniciar o processo com chrt em vez de reprogramar um pid existente. Parece que, se você reprogramar, apenas o primeiro thread recebe a classe RR. No entanto, se você iniciá-lo com chrt , cada segmento obtém isso.

    
por Egil 30.06.2011 / 18:45

Tags