Bagaimana menjalankan program dengan kebijakan SCHED_RR dari baris perintah?

11

Secara default, program dijalankan dengan Time Sharing (kebijakan TS) di Linux. Bagaimana menjalankan program dengan kebijakan SCHED_RR di Linux dari baris perintah?

Terima kasih telah memberikan informasi tentang perintah chrt (1). Saya telah menggunakan perintah untuk menjalankan Firefox dengan kebijakan RR, tetapi seperti yang Anda lihat di bawah, hanya utas utama Firefox yang berjalan dengan kebijakan RR. Bisakah Anda memberi tahu saya cara menjalankan semua utas Firefox lainnya juga dengan kebijakan 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

Sunting: Saya menjalankan program pthreads sederhana berikut dan menguji seperti di atas. Sayangnya perintah chrt hanya mengubah kelas utas utama. Silahkan lihat di bawah ini.

$ 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);
}
samarasa
sumber

Jawaban:

10

Gunakan chrtperintah denganchrt --rr <priority between 1-99> <command>

Contoh:

chrt --rr 99 ls

Perhatikan bahwa pengaturan SCHED_RRmemerlukan izin root, jadi Anda harus melakukan root atau menjalankannya dengan sudo.

Anda juga dapat menggunakan chrtuntuk memberikan prioritas proses yang sedang berjalan:

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

Perintah yang sama juga berlaku untuk kelas penjadwalan lainnya, meskipun dengan parameter yang berbeda, bukan -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)

Edit:

Dalam kasus Firefox, harus spesifik untuk Firefox. Dalam aplikasi multithreaded saya menulis sendiri, semua utas menjaga kelas RR. Seperti yang terlihat pada output Anda, dua utas memiliki RR kelas, jadi bukan hanya utas induk juga.

Edit 2:

Cobalah memulai proses dengan chrtalih - alih menjadwal ulang pid yang ada. Tampaknya jika Anda menjadwal ulang, hanya utas pertama yang mendapat kelas RR. Namun, jika Anda memulainya chrt, setiap utas mendapatkannya.

Egil
sumber
Terima kasih @Egil. Ngomong-ngomong, kelas scheduking default adalah TS benar. Anda dapat melihat di output perintah ps.
samarasa
Ya..itu bekerja dengan cara ini. Nah, itu tidak berfungsi jika kita memberi pid.
samarasa
ada terlalu sedikit -r(hanya digunakan dua kali), saya sarankan menggunakan -rrrrrrrrrsebagai gantinya ;-P
poige
Tidak perlu root untuk menjalankannya pada saya ...
enigmaticPhysicist
@amarasa: mungkin-opsi adalah yang Anda butuhkan. Dari manual:-a, --all-tasks Set or retrieve the scheduling attributes of all the tasks (threads) for a given PID.
Narcolessico
0

Cukup tambahkan kode ini di dalam kode utas:

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

Ini akan memberikan setiap prioritas utas RR maksimum.

Zibri
sumber