Komut satırından SCHED_RR ilkesi ile bir program nasıl çalıştırılır?


11

Varsayılan olarak programlar Linux'ta Zaman Paylaşımı (TS ilkesi) ile çalışır. Komut satırından Linux'ta SCHED_RR ilkesi olan bir program nasıl çalıştırılır?

Chrt (1) komutu hakkında bilgi verdiğiniz için teşekkür ederiz. Komutu, Firefox'u RR ilkesiyle çalıştırmak için kullandım, ancak aşağıda gördüğünüz gibi, yalnızca Firefox'un ana iş parçacığı RR ilkesiyle çalışır. Bana Firefox'un diğer tüm iş parçacıklarını RR politikasıyla nasıl çalıştıracağınızı söyleyebilir misiniz?

$ 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

Düzenleme: Ben aşağıdaki basit pthreads programı koştu ve yukarıdaki gibi test. Ne yazık ki chrt komutu sadece ana iş parçacığının sınıfını değiştirir. Lütfen aşağıya bakın.

$ 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

---- Program ----

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

Yanıtlar:


10

Kullanım chrtile komutuchrt --rr <priority between 1-99> <command>

Misal:

chrt --rr 99 ls

Ayarın SCHED_RRkök izinleri gerektirdiğini unutmayın , bu nedenle root olmanız veya sudo ile çalıştırmanız gerekir.

chrtÇalışan bir işleme gerçek zamanlı öncelik vermek için de kullanabilirsiniz :

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

Aynı komutlar, -rr yerine farklı bir parametre olsa da, diğer zamanlama sınıfları için de geçerlidir:

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)

Düzenle:

Firefox durumunda, Firefox'a özgü olmalıdır. Çok iş parçacıklı bir uygulamada kendim yazdım, tüm iş parçacıkları RR sınıfını koruyor. Çıktınızda görüldüğü gibi, iki iş parçacığının RR sınıfı vardır, bu nedenle yalnızca ana iş parçacığı da değildir.

Düzenleme 2:

chrtMevcut bir pideyi yeniden planlamak yerine işlemi başlatmayı deneyin . Yeniden zamanladıysanız, yalnızca ilk iş parçacığı RR sınıfı alır gibi görünüyor. Ancak, ile başlarsanız chrt, her iş parçacığı alır.


Teşekkürler @Egil. Bu arada, varsayılan zamanlama sınıfı TS hakkıdır. Ps komutunun çıktısında görebilirsiniz.
samarasa

Evet ... bu şekilde çalışıyor. Yani, pid verirsek işe yaramıyor.
samarasa

çok az var -r(sadece iki kez kullanılır), -rrrrrrrrrbunun yerine kullanmanızı öneririm
;-P

Benim
ucumda

@samarasa: belki - ihtiyacınız olan seçenek. Kılavuzdan:-a, --all-tasks Set or retrieve the scheduling attributes of all the tasks (threads) for a given PID.
Narcolessico

0

Bu kodu iş parçacığı kodunun içine eklemeniz yeterlidir:

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

Bu, her bir iş parçacığına maksimum RR önceliği verecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.