Linux:为什么FIFO调度程序在1核CPU机器上无法按预期工作?

时间:2020-05-07 17:40:06

标签: c linux linux-kernel scheduler

我正在学习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);
    }
  }
}

我在2个终端上以优先级1运行该程序:./main 1。因为我的CPU只有1个内核,所以由于FIFO属性,我预计只有第一个终端可以运行。但是,在实际测试中:两个终端都可以运行代码。

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

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

请为我解释原因。

1 个答案:

答案 0 :(得分:2)

您应该始终检查系统调用的返回值和errno的对应值(当该返回值为负数时)。就您而言,您可能没有以正确的权限运行该程序。当您请求优先级高于sched_setscheduler(2)的软限制的调度策略CAP_SYS_NICE时,SCHED_FIFO需要具备RLIMIT_RTPRIO的功能或以root身份运行,可以使用ulimit -r进行设置。此资源限制的典型值为0,它禁止非特权进程请求FIFO调度策略。

有关更多详细信息,请参见here,有关可能的错误值,请参见here