c-Linux:为什么FIFO调度程序在1核CPU机器上不能按预期工作



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

#include <sched.h>
#include <stdio.h>
int main(int argc, char **argv)
{
printf("Setting SCHED_FIFO and priority to %dn",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属性,我预计只有第一个终端可以运行。然而,在真实的测试情况下:两个终端都可以运行代码。

这是我运行命令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

请帮我解释一下原因。

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

请参阅此处了解更多详细信息,并参阅此处了解可能的错误值。

最新更新