是否有可能用一个SCHED_FIFO进程“挂起”一个Linux机器?

我想要一个实时的过程接pipe我的电脑。 🙂

我一直在玩这个。 我创build了一个基本上是一段while (1)的过程while (1) (永远不会阻塞也不会产生处理器),并使用schedtool通过SCHED_FIFO策略(也试过schedtool来运行它。 但是,这个过程也让其他进程也运行。

然后有人告诉我有关sched_rt_runtime_ussched_rt_period_us 。 所以我将运行时设置为-1 ,以使实时进程接pipe处理器(并且试图使两个值相同),但是它也不起作用。

我在Linux 2.6.27-16-server上,只有一个CPU的虚拟机。 我究竟做错了什么?

谢谢,

编辑:我不想要一个叉子炸弹。 我只想要一个进程永远运行,而不让其他进程运行。

还有一个我不知道的保护。

如果你只有一个处理器,并且希望有一个这样的SCHED_FIFO进程(一个永远不会阻塞也不会自动处理的进程)来垄断它,除了给它一个高优先级(在大多数情况下并不是必须的,但不会伤害)至:

  1. sched_rt_runtime_us设置为-1sched_rt_period_us的值
  2. 如果您配置了组计划,请将/cgroup/cpu.rt_runtime_us设置为-1 (以防在/cgroup上安装cgroup文件系统)

显然,我已经配置了群组调度,并没有绕过最后的保护。

如果你有N处理器,并且希望你的N进程垄断处理器,你可以做同样的事情,但是从你的shell启动它们(在你启动最后一个之前,shell不会卡住,因为它会有处理器运行)。 如果你想确定每个进程都会转到不同的处理器,请相应地设置它的CPU亲和力。

感谢大家的回复。

我不确定schedtool,但是如果您成功地使用sched_setscheduler将调度程序更改为SCHED_FIFO,那么运行一个不阻塞的任务,那么一个内核将完全分配给任务。 如果这是唯一的核心,那么根本不会运行SCHED_OTHER任务(即除少数内核线程之外的任何任务)。

我自己试过了。

所以我推测你的“非阻塞”任务是阻塞的,或者你的schedtool程序无法改变调度器(或者改变了错误的任务)。

你也可以让你处理一个最高优先级为1的SCHED_FIFO。所以这个过程将永远运行,并且不会被预先占用。