Làm cách nào để chạy chương trình với chính sách SCHED_RR từ dòng lệnh?


11

Theo mặc định, các chương trình chạy với Chia sẻ thời gian (chính sách TS) trên Linux. Làm cách nào để chạy chương trình với chính sách SCHED_RR trên Linux từ dòng lệnh?

Cảm ơn đã cung cấp thông tin về lệnh chrt (1). Tôi đã sử dụng lệnh để chạy Firefox với chính sách RR, nhưng như bạn thấy bên dưới, chỉ có luồng chính của Firefox chạy với chính sách RR. Bạn có thể cho tôi biết cách chạy tất cả các luồng khác của Firefox với chính sách RR không.

$ 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

Chỉnh sửa: Tôi đã chạy chương trình pthreads đơn giản sau đây và thử nghiệm như trên. Thật không may, lệnh chrt chỉ thay đổi lớp của luồng chính. Vui lòng xem bên dưới.

$ 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

---- Chương trình----

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

Câu trả lời:


10

Sử dụng chrtlệnh vớichrt --rr <priority between 1-99> <command>

Thí dụ:

chrt --rr 99 ls

Lưu ý rằng cài đặt SCHED_RRyêu cầu quyền root, do đó bạn phải root hoặc chạy nó với sudo.

Bạn cũng có thể sử dụng chrtđể ưu tiên thời gian thực cho quá trình chạy:

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

Các lệnh tương tự cũng áp dụng cho các lớp lập lịch khác, mặc dù với một tham số khác thay vì -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)

Biên tập:

Trong trường hợp Firefox, nó phải đặc biệt đối với Firefox. Trong một ứng dụng đa luồng tôi đã tự viết, tất cả các luồng giữ lớp RR. Như đã thấy trong đầu ra của bạn, hai luồng có lớp RR, do đó, nó không chỉ là luồng gốc.

Chỉnh sửa 2:

Hãy thử bắt đầu quá trình với chrtthay vì sắp xếp lại một pid hiện có. Có vẻ như nếu bạn lên lịch lại, chỉ có luồng đầu tiên được lớp RR. Tuy nhiên, nếu bạn bắt đầu với nó chrt, mọi chủ đề đều có được nó.


Cảm ơn @Egil. Nhân tiện, lớp lập lịch mặc định là TS đúng. Bạn có thể thấy trong đầu ra lệnh ps.
samarasa

Yeah..its làm việc theo cách này. SOmehow, nó không hoạt động nếu chúng ta cho pid.
samarasa

có quá ít -r(chỉ được sử dụng hai lần), tôi đề nghị sử dụng -rrrrrrrrrthay thế ;-P
poige

Nó không cần root để chạy trên đầu của tôi ...
enigmaticPhysicist

@samarasa: có thể -a tùy chọn là những gì bạn cần. Từ hướng dẫn:-a, --all-tasks Set or retrieve the scheduling attributes of all the tasks (threads) for a given PID.
Narcolessico

0

Chỉ cần thêm mã này bên trong mã chủ đề:

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

Điều này sẽ cung cấp cho mỗi chủ đề tối đa RR ưu tiên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.