Можно ли "повесить" коробку Linux с процессом SCHED_FIFO? - PullRequest
4 голосов
/ 28 августа 2010

Я хочу, чтобы мой компьютер обрабатывался в режиме реального времени.:)

Я немного поиграл с этим.Я создал процесс, который по сути является while (1) (никогда не блокирует и не возвращает процессор) и использовал schedtool для его запуска с политикой SCHED_FIFO (также пытался chrt).Однако этот процесс позволял запускать и другие процессы.

Затем кто-то рассказал мне о sched_rt_runtime_us и sched_rt_period_us.Поэтому я установил время выполнения на -1, чтобы процесс в режиме реального времени взял на себя процессор (и также попытался сделать оба значения одинаковыми), но он тоже не сработал.на сервере Linux 2.6.27-16, на виртуальной машине с одним процессором.Что я делаю не так?

Спасибо,

РЕДАКТИРОВАТЬ: я не хочу вилку бомбу.Я просто хочу, чтобы один процесс работал вечно, не позволяя другим процессам работать.

Ответы [ 3 ]

5 голосов
/ 30 августа 2010

Есть еще одна защита, о которой я не знал.

Если у вас есть только один процессор и вы хотите, чтобы процесс SCHED_FIFO, подобный этому (тот, который никогда не блокирует и не отдаёт процессор добровольно) монополизировал его, кроме того, что он имеет высокий приоритет (в большинстве случаев это не обязательно, но больно) надо:

  1. Установите sched_rt_runtime_us на -1 или на значение в sched_rt_period_us
  2. Если вы настроили групповое планирование, установите /cgroup/cpu.rt_runtime_us на -1 (в случае вы монтируете файловую систему cgroup на /cgroup)

Очевидно, у меня настроено групповое планирование, и я не обошел эту последнюю защиту.

Если у вас есть N процессоры и вы хотите, чтобы ваши процессы N монополизировали процессор, вы просто делаете то же самое, но запускаете все из своей оболочки (оболочка не должна зависать, пока вы не запустите последний из них). , поскольку он будет иметь процессоры для запуска). Если вы хотите быть уверены, что каждый процесс перейдет на другой процессор, установите его привязку к процессору соответственно.

Спасибо всем за ответы.

3 голосов
/ 29 августа 2010

Я не уверен насчет schedtool, но если вы успешно измените планировщик с помощью sched_setscheduler на SCHED_FIFO, затем запустите задачу, которая не блокируется, тогда одно ядро ​​будет полностью выделено для задачи.Если это единственное ядро, никакие задачи SCHED_OTHER не будут запускаться вообще (то есть что-либо, кроме нескольких потоков ядра).

Я сам пробовал.«не блокирующая» задача блокировалась, или ваша программа schedtool не смогла изменить планировщик (или изменила его для неправильной задачи).

1 голос
/ 08 марта 2011

Также вы можете настроить обработку SCHED_FIFO с наивысшим приоритетом, равным 1. Таким образом, процесс будет выполняться вечно, и его нельзя будет прервать.

...