Comment exécuter un programme avec la stratégie SCHED_RR à partir de la ligne de commande?

11

Par défaut, les programmes s'exécutent avec Time Sharing (politique TS) sous Linux. Comment exécuter un programme avec la politique SCHED_RR sur Linux à partir de la ligne de commande?

Merci d'avoir donné des informations sur la commande chrt (1). J'ai utilisé la commande pour exécuter Firefox avec la stratégie RR, mais comme vous le voyez ci-dessous, seul le thread principal de Firefox fonctionne avec la stratégie RR. Pourriez-vous me dire comment exécuter tous les autres threads de Firefox également avec la stratégie 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: j'ai exécuté le programme pthreads simple suivant et testé comme ci-dessus. Malheureusement, la commande chrt ne modifie que la classe du thread principal. Veuillez voir ci-dessous.

$ 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

---- Programme ----

#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
la source

Réponses:

10

Utilisez la chrtcommande avecchrt --rr <priority between 1-99> <command>

Exemple:

chrt --rr 99 ls

Notez que la configuration SCHED_RRnécessite des autorisations root, vous devez donc être root ou l'exécuter avec sudo.

Vous pouvez également utiliser chrtpour donner une priorité en temps réel à un processus en cours d'exécution:

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

Les mêmes commandes s'appliquent également aux autres classes de planification, mais avec un paramètre différent au lieu 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)

Éditer:

Dans le cas de Firefox, il doit être spécifique à Firefox. Dans une application multithread que j'ai écrite moi-même, tous les threads conservent la classe RR. Comme vu dans votre sortie, deux threads ont la classe RR, donc ce n'est pas seulement le thread parent non plus.

Modifier 2:

Essayez de démarrer le processus avec chrtau lieu de replanifier un pid existant. Il semble que si vous replanifiez, seul le premier thread obtient la classe RR. Cependant, si vous le démarrez par chrt, chaque thread l'obtient.

Egil
la source
Merci @Egil. Soit dit en passant, la classe de planification par défaut est TS right. Vous pouvez voir dans la sortie de la commande ps.
samarasa
Ouais ... ça marche de cette façon. Alors, ça ne marche pas si on donne pid.
samarasa
il y en a trop peu -r(seulement utilisé deux fois), je suggère d'utiliser à la -rrrrrrrrrplace ;-P
poige
Il n'avait pas besoin de root pour fonctionner de mon côté ...
enigmaticPhysicist
@samarasa: peut-être qu'une option est ce dont vous avez besoin. Extrait du manuel:-a, --all-tasks Set or retrieve the scheduling attributes of all the tasks (threads) for a given PID.
Narcolessico
0

Ajoutez simplement ce code dans le code du 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);

Cela donnera à chaque thread une priorité RR maximale.

Zibri
la source