Come eseguire un programma con la politica SCHED_RR dalla riga di comando?


11

Per impostazione predefinita, i programmi vengono eseguiti con la condivisione del tempo (politica TS) su Linux. Come eseguire un programma con la politica SCHED_RR su Linux dalla riga di comando?

Grazie per aver dato informazioni sul comando chrt (1). Ho usato il comando per eseguire Firefox con la politica RR, ma come vedi sotto, solo il thread principale di Firefox funziona con la politica RR. Potresti dirmi come eseguire tutti gli altri thread di Firefox anche con la politica 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

Modifica: ho eseguito il seguente semplice programma pthreads e testato come sopra. Sfortunatamente il comando chrt cambia solo la classe del thread principale. Vedi sotto.

$ 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

---- Programma----

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

Risposte:


10

Usa il chrtcomando conchrt --rr <priority between 1-99> <command>

Esempio:

chrt --rr 99 ls

Nota che l'impostazione SCHED_RRrichiede i permessi di root, quindi devi essere root o eseguirlo con sudo.

Puoi anche usare chrtper dare una priorità in tempo reale a un processo in esecuzione:

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

Gli stessi comandi si applicano anche ad altre classi di pianificazione, sebbene con un parametro diverso invece di -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)

Modificare:

Nel caso di Firefox, deve essere specifico per Firefox. In un'applicazione multithread che ho scritto da solo, tutti i thread mantengono la classe RR. Come visto nel tuo output, due thread hanno classe RR, quindi non è nemmeno solo il thread principale.

Modifica 2:

Prova ad avviare il processo chrtinvece di riprogrammare un pid esistente. Sembra che se riprogrammi, solo il primo thread ottiene la classe RR. Tuttavia, se lo inizi con chrt, ogni thread lo ottiene.


Grazie @Egil. A proposito, la classe di pianificazione predefinita è TS corretta. Puoi vedere nell'output del comando ps.
samarasa,

Sì ... funziona in questo modo. In qualche modo, non funziona se diamo pid.
samarasa,

ce ne sono troppi -r(usati solo due volte), suggerisco di usare -rrrrrrrrrinvece ;-P
poige

Non aveva bisogno di root per funzionare da parte mia ...
enigmatico

@samarasa: forse -una opzione è ciò di cui hai bisogno. Dal manuale:-a, --all-tasks Set or retrieve the scheduling attributes of all the tasks (threads) for a given PID.
Narcolessico,

0

Basta aggiungere questo codice all'interno del codice 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);

Questo darà ad ogni thread la massima priorità RR.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.