我想要一个实时的过程接pipe我的电脑。 🙂
我一直在玩这个。 我创build了一个基本上是一段while (1)
的过程while (1)
(永远不会阻塞也不会产生处理器),并使用schedtool
通过SCHED_FIFO
策略(也试过schedtool
来运行它。 但是,这个过程也让其他进程也运行。
然后有人告诉我有关sched_rt_runtime_us
和sched_rt_period_us
。 所以我将运行时设置为-1
,以使实时进程接pipe处理器(并且试图使两个值相同),但是它也不起作用。
我在Linux 2.6.27-16-server上,只有一个CPU的虚拟机。 我究竟做错了什么?
谢谢,
编辑:我不想要一个叉子炸弹。 我只想要一个进程永远运行,而不让其他进程运行。
还有一个我不知道的保护。
如果你只有一个处理器,并且希望有一个这样的SCHED_FIFO
进程(一个永远不会阻塞也不会自动处理的进程)来垄断它,除了给它一个高优先级(在大多数情况下并不是必须的,但不会伤害)至:
sched_rt_runtime_us
设置为-1
或sched_rt_period_us
的值 /cgroup/cpu.rt_runtime_us
设置为-1
(以防在/cgroup
上安装cgroup文件系统) 显然,我已经配置了群组调度,并没有绕过最后的保护。
如果你有N
处理器,并且希望你的N
进程垄断处理器,你可以做同样的事情,但是从你的shell启动它们(在你启动最后一个之前,shell不会卡住,因为它会有处理器运行)。 如果你想确定每个进程都会转到不同的处理器,请相应地设置它的CPU亲和力。
感谢大家的回复。
我不确定schedtool,但是如果您成功地使用sched_setscheduler将调度程序更改为SCHED_FIFO,那么运行一个不阻塞的任务,那么一个内核将完全分配给任务。 如果这是唯一的核心,那么根本不会运行SCHED_OTHER任务(即除少数内核线程之外的任何任务)。
我自己试过了。
所以我推测你的“非阻塞”任务是阻塞的,或者你的schedtool程序无法改变调度器(或者改变了错误的任务)。
你也可以让你处理一个最高优先级为1的SCHED_FIFO。所以这个过程将永远运行,并且不会被预先占用。