整个一个核心致力于单一过程

在Linux中有没有办法将一个CPU内核分配给特定的进程,并且在这个内核上不应该有任何其他进程或中断处理程序?

我已经阅读了有关Linux 绑定进程使用taskset实用程序的CPU的进程亲和力,但这并不能解决我的问题,因为它只是试图将给定的进程仿射到该核心,但是可能在该核心上安排其他进程 ,这是我想要避免的。

我们应该改变内核代码进行调度吗?

就在这里。 事实上,有两种不同的方式来做到这一点:-)

现在,完成你想要的最好的方法是做到以下几点:

  1. 在引导期间,从引导装载程序将参数isolcpus = [cpu_number]添加到Linux内核命令行。 这将指示Linux调度程序不要在该CPU上运行任何常规任务,除非特别要求使用cpu亲缘关系。

  2. 使用IRQ亲和力来设置其他CPU来处理所有中断,以便隔离的CPU不会收到任何中断。

  3. 使用CPU关联将您的特定任务修复到隔离的CPU。

这将为您提供Linux可以提供的与CPU隔离相关的最佳function,而无需使用树外和开发补丁。

你的任务仍然会不时被Linux代码中断,包括其他任务 – 例如计时器滴答声中断和调度程序代码,来自其他CPU的IPI以及诸如工作队列内核线程之类的东西,尽pipe中断应该是非常小的。

对于(几乎)完整的中断源列表,请查看我的页面https://github.com/gby/linux/wiki

另一种方法是使用cpusets,这种方式更加优雅和dynamic,但是在这个时候会有一些弱点(例如没有定时器的迁移),这使得我推荐使用粗糙而有效的isolcpus参数。

请注意,Linux社区目前正在开展工作,以解决所有这些问题,并提供更好的隔离。

有Redhat的文章谈论它。 它修改引导参数isolcpus

还有罗伯特·洛夫写的一篇旧文章 。 那篇文章里有解决scheme。

所有进程的孩子都会收到与父亲相同的CPU亲和力掩码。

那么,我们需要做的就是让init将自己绑定到一个处理器。 所有其他进程,init的本质是进程树的根,因此也是所有进程的超级进程,然后同样绑定到一个处理器。

将一个完整的CPU内核专用于特定的程序

虽然taskset允许将特定程序分配给某些CPU,但这并不意味着这些CPU上不会安排其他程序或进程。 如果要防止出现这种情况并将整个CPU内核专用于特定程序,则可以使用“isolcpus”内核参数,该参数允许您在引导期间保留CPU内核。

在引导过程或GRUBconfiguration文件中将内核参数“isolcpus =”添加到引导加载程序。 那么Linux调度程序将不会在预留的CPU内核上安排任何常规进程,除非特别要求使用taskset。 例如,要保留CPU内核0和1,请添加“isolcpus = 0,1”内核参数。 启动后,使用taskset将保留的CPU内核安全地分配给程序。

来源(S)

  1. http://xmodulo.com/2013/10/run-program-process-specific-cpu-cores-linux.html
  2. http://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/re46.html

即使按照gby的答案中的步骤,内核任务也会在隔离的CPU内核上执行。 在linux RT_PREEMPT实时项目中正在进行工作来改善这一点。 所以如果你没有使用来自RP_PREEMPT的尖端实时内核,可能无法完全隔离一个CPU内核。

根据文件

Linux调度程序将遵守给定的CPU亲和性,并且该进程不会在任何其他CPU上运行。

没有提到具体的处理器将被给予专门处理。