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

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

默认情况下,Linux 上的程序以分时(TS 策略)运行。如何SCHED_RR从命令行在 Linux 上运行具有该策略的程序?

感谢您提供有关 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);
}

答案1

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

例子:

# Note: `sudo` is not required if you are root
chrt --rr 99 ls

# use `sudo` otherwise
sudo 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,则每个线程都会获得它。

答案2

只需在线程代码中添加此代码:

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

这将为运行此代码的任何线程提供最高SCHED_RR(循环实时调度程序)优先级99

看:

  1. 每个调度器策略的描述,包括SCHED_RR循环软实时调度器:https://man7.org/linux/man-pages/man7/sched.7.html
  2. SCHED_RR需要指出的是,调度程序的最小优先级和最大优先级分别为199https://man7.org/linux/man-pages/man2/sched_get_priority_min.2.html
  3. https://man7.org/linux/man-pages/man3/pthread_setschedparam.3.html

相关内容