Wie führe ich ein Programm mit der SCHED_RR-Richtlinie über die Befehlszeile aus?

11

Standardmäßig werden Programme mit Time Sharing (TS-Richtlinie) unter Linux ausgeführt. Wie führe ich ein Programm mit der SCHED_RR-Richtlinie unter Linux über die Befehlszeile aus?

Vielen Dank, dass Sie Informationen zum Befehl chrt (1) gegeben haben. Ich habe den Befehl verwendet, um Firefox mit der RR-Richtlinie auszuführen, aber wie Sie unten sehen, wird nur der Hauptthread von Firefox mit der RR-Richtlinie ausgeführt. Können Sie mir sagen, wie alle anderen Threads von Firefox auch mit RR-Richtlinien ausgeführt werden?

$ 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

Bearbeiten: Ich habe das folgende einfache Pthreads-Programm ausgeführt und wie oben getestet. Leider ändert der Befehl chrt nur die Klasse des Hauptthreads. Siehe unten.

$ 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

---- Programm----

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

Antworten:

10

Verwenden Sie den chrtBefehl mitchrt --rr <priority between 1-99> <command>

Beispiel:

chrt --rr 99 ls

Beachten Sie, dass für die Einstellung SCHED_RRRoot-Berechtigungen erforderlich sind. Sie müssen also entweder root sein oder sie mit sudo ausführen.

Sie können chrteinem laufenden Prozess auch Echtzeitpriorität zuweisen:

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

Dieselben Befehle gelten auch für andere Planungsklassen, allerdings mit einem anderen Parameter anstelle von -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)

Bearbeiten:

Im Firefox-Fall muss es für Firefox spezifisch sein. In einer Multithread-Anwendung, die ich selbst geschrieben habe, behalten alle Threads die RR-Klasse bei. Wie in Ihrer Ausgabe zu sehen ist, haben zwei Threads die Klasse RR, sodass es sich nicht nur um den übergeordneten Thread handelt.

Bearbeiten 2:

Versuchen Sie, den Prozess mit zu starten, chrtanstatt eine vorhandene PID neu zu planen. Wenn Sie neu planen, erhält anscheinend nur der erste Thread die RR-Klasse. Wenn Sie jedoch damit beginnen, wird es von chrtjedem Thread abgerufen.

Egil
quelle
Danke @Egil. Übrigens ist die Standard-Planungsklasse TS richtig. Sie können in der Ausgabe des Befehls ps sehen.
Samarasa
Ja ... es funktioniert auf diese Weise. Also, es funktioniert nicht, wenn wir pid geben.
Samarasa
es gibt zu wenige -r(nur zweimal verwendet), ich schlage vor, -rrrrrrrrrstattdessen zu verwenden ;-P
poige
Es hat nicht Wurzel muss an meinem Ende laufen ...
enigmaticPhysicist
@samarasa: Vielleicht ist eine Option das, was Sie brauchen. Aus dem Handbuch:-a, --all-tasks Set or retrieve the scheduling attributes of all the tasks (threads) for a given PID.
Narcolessico
0

Fügen Sie einfach diesen Code in den Thread-Code ein:

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

Dies gibt jedem Thread die maximale RR-Priorität.

Zibri
quelle