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

萨马拉萨

默认情况下,程序在 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);
}
埃吉尔

使用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,则每个线程都会得到它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将线程策略设置为 SCHED_RR 时出现未知错误

如何从命令行运行程序?

当调度策略为SCHED_RR时,pthread临界区中经过时间尖峰的原因可能是什么?

如何从命令行运行带有程序名称且没有路径的python程序?

如何从具有提升权限的命令行运行程序

是否可以从命令行运行rascal程序?

classpath-从命令行运行Java程序

可以从命令行运行WinForms程序吗?

从命令行运行Python程序

如何从命令行运行.NET Core控制台应用程序

如何从命令行运行GUI应用程序?

如何部署从命令行运行的Javascript应用程序?

如何在Windows上从命令行运行Java程序?

如何从命令行运行 delphi VCL 应用程序

如何从命令行运行 MSIX 安装的应用程序

如何从命令行中从具有包类的闪存驱动器中运行Java程序?

在Linux上SCHED_FIFO和SCHED_RR

从命令行运行时如何在spring boot应用程序中传递命令行参数

从命令行编译和运行具有复杂文件结构的java程序

能够从IntelliJ运行Java程序,但不能从命令行运行

为运行测试与从命令行运行程序获取不同的 ModuleNotFound 错误

打开 PhpStorm 从命令行运行代码格式化程序

Ubuntu 程序不会从命令行运行,但会说它们已安装

从命令行运行应用程序时,JavaFX 8视频播放冻结

在Windows 10上从命令行运行Java程序

从命令行运行ASP.NET Web应用程序

从命令行运行包裹打包程序不会停止该过程

从命令行运行 Maven Web 应用程序

从命令行运行的 PyQt 程序不实时路由控制台输出