如何从命令行运行具有SCHED_RR策略的程序?


11

默认情况下,程序在Linux上使用“时间共享”(TS策略)运行。如何从命令行在Linux上运行具有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);
}

Answers:


10

chrt命令与chrt --rr <priority between 1-99> <command>

例:

chrt --rr 99 ls

请注意,该设置SCHED_RR需要root权限,因此您必须是root或使用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 right。您可以在ps命令输出中看到。
samarasa

是的..它以这种方式工作。怎么样,如果我们给pid,它是行不通的。
samarasa

太少了-r(只使用了两次),我建议-rrrrrrrrr改用;-P
poige

它不需要root就可以在我的终端上运行
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优先级。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.