Linux: Почему планировщик FIFO не работает должным образом на машине с 1 ядром ЦП? - PullRequest
0 голосов
/ 07 мая 2020

Я изучаю 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 на 2 терминалах: ./main 1. Поскольку у моего ЦП только одно ядро, я ожидаю, что только первый терминал может работать из-за атрибута FIFO. Однако в реальной тестовой ситуации: оба терминала могут запускать код.

Вот информация о моем процессоре, когда я запускаю команду 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

Пожалуйста, объясните мне, почему .

1 Ответ

2 голосов
/ 07 мая 2020

Вы всегда должны проверять возвращаемое значение системных вызовов и соответствующее значение errno, если это возвращаемое значение отрицательно. В вашем случае вы, вероятно, не запускаете программу с нужными привилегиями. sched_setscheduler(2) требует возможности CAP_SYS_NICE или запускается как root, когда вы запрашиваете политику планирования SCHED_FIFO с приоритетом выше мягкого ограничения RLIMIT_RTPRIO, который можно получить и установить с помощью ulimit -r. Типичное значение этого ограничения ресурса равно 0, что запрещает непривилегированным процессам запрашивать политику планирования FIFO.

См. здесь для получения более подробной информации и здесь для возможные значения ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...