¿Cómo ejecutar un programa con la política SCHED_RR desde la línea de comandos?

11

De forma predeterminada, los programas se ejecutan con Tiempo compartido (política de TS) en Linux. ¿Cómo ejecutar un programa con la política SCHED_RR en Linux desde la línea de comandos?

Gracias por dar información sobre el comando chrt (1). He usado el comando para ejecutar Firefox con la política RR, pero como puede ver a continuación, solo el hilo principal de Firefox se ejecuta con la política RR. ¿Podría decirme cómo ejecutar todos los otros hilos de Firefox también con la 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

Editar: Ejecuté el siguiente programa pthreads simple y probé como el anterior. Lamentablemente, el comando chrt solo cambia la clase del hilo principal. Por favor ver más abajo.

$ 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
fuente

Respuestas:

10

Use el chrtcomando conchrt --rr <priority between 1-99> <command>

Ejemplo:

chrt --rr 99 ls

Tenga en cuenta que la configuración SCHED_RRrequiere permisos de root, por lo que debe ser root o ejecutarlo con sudo.

También puede usar chrtpara dar prioridad a un proceso en ejecución en tiempo real:

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

Los mismos comandos se aplican también a otras clases de programación, aunque con un parámetro diferente en lugar 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:

En el caso de Firefox, debe ser específico para Firefox. En una aplicación multiproceso que escribí yo mismo, todos los hilos mantienen la clase RR. Como se ve en su salida, dos subprocesos tienen clase RR, por lo que tampoco es solo el subproceso principal.

Edición 2:

Intente iniciar el proceso en chrtlugar de reprogramar un pid existente. Parece que si reprograma, solo el primer hilo obtiene la clase RR. Sin embargo, si lo comienza chrt, cada hilo lo obtiene.

Egil
fuente
Gracias @Egil. Por cierto, la clase de planificación predeterminada es TS right. Puedes ver en la salida del comando ps.
samarasa
Sí ... está trabajando de esta manera. Por lo tanto, no funciona si le damos pid.
samarasa
hay muy pocos -r(solo se usan dos veces), sugiero usar en su -rrrrrrrrrlugar ;-P
poige
No necesitaba root para ejecutarse de mi lado ...
enigmaticPhysicist
@samarasa: tal vez, una opción es lo que necesita. Del manual:-a, --all-tasks Set or retrieve the scheduling attributes of all the tasks (threads) for a given PID.
Narcolessico
0

Simplemente agregue este código dentro del código del hilo:

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

Esto le dará a cada hilo la máxima prioridad RR.

Zibri
fuente