如何将父进程和子进程保持在同一个核心上

6
我知道可以使用sched_setaffinity将进程(父进程)固定在一个核心上,然后fork的子进程会继承亲缘关系并且也会被固定在同一个核心上。但是,我不想永远将它们固定在同一个核心上。理想情况下,我希望它们能够一直保持在同一个CPU上,即如果操作系统调度程序将父进程迁移,则子进程应该跟随父进程并迁移到与父进程相同的CPU上。
一种可能的方法是使用共享变量,其中父进程定期更新其当前CPU。然后子进程可以定期查找此变量并使用sched_setaffinity迁移到与父进程相同的CPU上。但是,这看起来有点hacky,并且可能涉及它们在单独的CPU上运行的时间段。有更好的方法来实现这一点吗?

2
我认为这应该是实现定义的,因操作系统而异。请添加更多信息。 - autistic
我认为你不能在Linux上这样做。但是你在这里所说的“运行在同一核心上”是什么意思?难道“运行在同一核心上”观察上等同于“从未同时运行”吗? - tmyklebu
首先,是的,我正在针对Linux(并且不关心可移植性)。现在,应用程序是这样的:父进程向子进程发送一个缓冲区,子进程执行foo(buffer)。因此,它们实际上从未“同时运行”,但是,如果它们在不同的核心上运行,则开销会显著增加(可能是由于L2 / L3不跨核心共享)。因此,我希望它们始终在同一CPU上运行。 - ngupta
1
这会有帮助吗?https://dev59.com/62DVa4cB1Zd3GeqPf7M_?lq=1 - NeonGlow
3
最简单、最有效的方法是使用单一进程来完成这个任务。您能否重构您的代码以实现这一点? - salezica
显示剩余2条评论
2个回答

1

是否可以在线程中运行子进程,而不是在其自己的进程中运行?


整个项目是将库作为单独的进程运行(以确保安全)。无论如何,我不再参与该项目,因此将关闭此问题。感谢大家的建议和帮助。 - ngupta

0

使用Gang调度是否有帮助?这样父进程和子进程就可以同时被调度。


我希望将父进程和子进程保持在同一个核心上,因为它们经常传递缓冲区,如果它们在不同的核心上运行,开销会显著增加,与它们在同一个核心上一起运行的情况相比。因此,即使它们被Gang调度,这种复制开销仍然是一个问题。 - ngupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接