C 在核心上运行用户任务,并且中断/抢占最少

C 在核心上运行用户任务,并且中断/抢占最少,c,multithreading,linux-kernel,scheduling,C,Multithreading,Linux Kernel,Scheduling,我希望在专用核心上运行一个长期任务,并希望该任务被最小程度地中断/抢占。我可以看到两种解决方案。哪一个更好或其他解决方案 1使用ISOLCPU设置亲和性并隔离核心 2使用SCHED_FIFO使线程实时,并将优先级设置为高 -如果这是更好的选择,那么优先级应该有多高?我可以把它设为99吗 我担心的是内核线程会抢占IPI…关于您提到的第一个解决方案,在引导期间添加参数isolcpus=[CPU no.]将指示Linux调度器不要在该CPU上运行任何任务,除非用户使用CPU关联性请求。但是这个CPU可

我希望在专用核心上运行一个长期任务,并希望该任务被最小程度地中断/抢占。我可以看到两种解决方案。哪一个更好或其他解决方案

1使用ISOLCPU设置亲和性并隔离核心

2使用SCHED_FIFO使线程实时,并将优先级设置为高 -如果这是更好的选择,那么优先级应该有多高?我可以把它设为99吗


我担心的是内核线程会抢占IPI…

关于您提到的第一个解决方案,在引导期间添加参数isolcpus=[CPU no.]将指示Linux调度器不要在该CPU上运行任何任务,除非用户使用CPU关联性请求。但是这个CPU可能会收到中断,这也可以通过设置IRQ关联来避免,这样隔离的CPU就不会收到任何中断。最后,在任务的代码中,您设置了与独立CPU的关联,这样就可以开始了。 但是,即使您遵循这些步骤,如果您没有使用RP_PREEMPT的实时内核,内核任务也会在隔离的CPU内核上执行,因此,除非您使用RT内核,否则可能无法完全隔离CPU内核。 参考-

关于使用SCHED_FIFO调度策略和使用高优先级值的第二个解决方案仍然不会阻止内核线程、计时器计时中断、ipi等抢占您的任务。因为调度策略和优先级是由内核调度所有其他用户空间进程和线程,而不适用于内核线程或进程。 因此,为任务设置高优先级并不意味着您将获得100%的CPU专用于任务。另外,手动将任务的CPU掩码设置为系统中的CPUSET也会导致问题和次优负载平衡器性能。您的任务仍然会不时地被Linux代码中断,包括其他任务,如计时器计时中断和调度程序代码、来自其他CPU的IPI以及工作队列内核线程等,尽管如果您在其他内核中没有太多活动,中断应该是非常小的

但是实现这一点的最干净的方法应该来自我在这个链接中找到的内核调整。虽然我没有亲自尝试过这一点,但我认为在您决定使用哪种方法之前,也值得看一看这篇文章