명령 줄에서 SCHED_RR 정책으로 프로그램을 실행하는 방법은 무엇입니까?


11

기본적으로 프로그램은 Linux에서 시간 공유 (TS 정책)로 실행됩니다. 커맨드 라인에서 리눅스에서 SCHED_RR 정책으로 프로그램을 실행하는 방법은 무엇입니까?

chrt (1) 명령에 대한 정보를 제공해 주셔서 감사합니다. RR 정책으로 Firefox를 실행하는 명령을 사용했지만 아래에서 볼 수 있듯이 Firefox의 기본 스레드 만 RR 정책으로 실행됩니다. RR 정책으로 Firefox의 다른 모든 스레드를 실행하는 방법을 알려주십시오.

$ 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

편집 : 다음과 같은 간단한 pthreads 프로그램을 실행하고 위와 같이 테스트했습니다. 불행히도 chrt 명령은 메인 스레드의 클래스 만 변경합니다. 아래를 봐주세요.

$ 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

---- 프로그램 ----

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

답변:


10

사용 chrt과 명령을chrt --rr <priority between 1-99> <command>

예:

chrt --rr 99 ls

설정 SCHED_RR에는 루트 권한이 필요하므로 루트이거나 sudo로 실행해야합니다.

chrt실행중인 프로세스에 실시간 우선 순위를 부여하는 데 사용할 수도 있습니다 .

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

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

편집하다:

Firefox의 경우 Firefox에 적합해야합니다. 내가 작성한 멀티 스레드 응용 프로그램에서 모든 스레드는 RR 클래스를 유지합니다. 출력에서 볼 수 있듯이 두 스레드에는 클래스 RR이 있으므로 부모 스레드뿐만 아니라

편집 2 :

chrt기존 pid를 다시 예약하는 대신 프로세스를 시작하십시오 . 일정을 변경하면 첫 번째 스레드 만 RR 클래스를 가져옵니다. 그러나로 시작하면 chrt모든 스레드가 가져옵니다.


@Egil에게 감사합니다. 그런데 기본 예약 클래스는 TS입니다. ps 명령 출력에서 ​​볼 수 있습니다.
사마 라사

예 .. 이런 식으로 작동합니다. 우리가 pid를 주면 작동하지 않습니다.
사마 라사

너무 적은이있는 -r(두 번 밖에 사용), 내가 사용하는 것이 좋습니다 -rrrrrrrrr대신 ;-P
poige

내 끝을 달리기 위해 루트가 필요하지 않았습니다 ...
enigmaticPhysicist

@ samarasa : 아마도 -a 옵션이 필요합니다. 매뉴얼에서 :-a, --all-tasks Set or retrieve the scheduling attributes of all the tasks (threads) for a given PID.
Narcolessico

0

스레드 코드 안에 다음 코드를 추가하십시오.

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

이것은 각 스레드에 최대 RR 우선 순위를 부여합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.