Linux系统。为什么在1核CPU的机器上,FIFO调度器不能如期工作?

问题描述 投票:0回答:1

我正在学习Linux调度器。首先,我想测试一下FIFO调度器。下面是我用来测试的代码。

#include <sched.h>
#include <stdio.h>
int main(int argc, char **argv)
{
  printf("Setting SCHED_FIFO and priority to %d\n",atoi(argv[1]));
  struct sched_param param;
  param.sched_priority = atoi(argv[1]);
  sched_setscheduler(0, SCHED_FIFO, &param);
  int n = 0;
  while(1) {
    n++;
    if (!(n % 10000000)) {
      printf("%s FIFO Prio %d running (n=%d)\n",argv[2], atoi(argv[1]),n);
    }
  }
}

我在两个终端上运行这个优先级为1的程序: ./main 1. 因为我的CPU只有1个核,所以由于FIFO属性,我期望只有第一个终端可以运行。然而,在实际测试的情况下:两个终端都可以运行代码。

以下是我运行命令时的CPU信息 lscpu:

Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              1
On-line CPU(s) list: 0
Thread(s) per core:  1
Core(s) per socket:  1
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               85
Model name:          Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz
Stepping:            4
CPU MHz:             2294.608
BogoMIPS:            4589.21
Virtualization:      VT-x
Hypervisor vendor:   KVM
Virtualization type: full
L1d cache:           32K
L1i cache:           32K
L2 cache:            4096K

请为我解释一下原因。

c linux linux-kernel scheduler
1个回答
2
投票

你应该经常检查系统调用的返回值和对应的 errno 当返回值为负值时。在你的情况下,你可能没有以正确的权限运行程序。sched_setscheduler(2) 需要 CAP_SYS_NICE 功能,或在请求调度策略时以root身份运行。SCHED_FIFO 优先级高于以下软限制 RLIMIT_RTPRIO可获得并可设置使用 ulimit -r. 该资源限制的典型值为0,它禁止无权限的进程请求FIFO调度策略。

参见 此处 更多细节和 此处 为可能的错误值。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.