【问题标题】:How to keep parent and child process on same core如何将父子进程保持在同一个核心上
【发布时间】:2013-01-23 03:39:59
【问题描述】:

我了解进程(父) 可以使用sched_setaffinity 固定到核心,然后分叉的进程继承亲和性,并且也将固定在相同的核心。但是,我不想让它们永远固定在同一个核心上。理想情况下,我希望他们在同一个 CPU 上保持在一起,即如果操作系统调度程序迁移父级,则子级应该跟随父级并迁移到与父级相同的 CPU。 p>

一种可能的方法是使用shared variable,其中父级会定期更新其当前 CPU。然后子进程可以定期查找这个变量并sched_setaffinity 迁移到与父进程相同的 CPU。但是,这看起来有点 hacky,并且可能涉及它们在单独的 CPU 上运行的时间段。有没有更好的方法来实现这一点?

【问题讨论】:

  • 我认为这是实现定义的,因操作系统而异。请添加更多信息。
  • 我认为你不能在 Linux 上做到这一点。但是这里的“在同一个核心上运行”是什么意思? “在同一个核心上运行”在观察上不等同于“从不同时运行”吗?
  • tmyklebu:首先,是的,我的目标是 Linux(并且不关心可移植性)。现在,应用程序是这样的,父级向执行 foo(buffer) 的子级发送一个缓冲区。因此,它们从来没有真正“同时运行”,但是,如果它们在不同的内核上运行,那么开销就会显着增加(可能是由于 L2/L3 没有在内核之间共享)。因此,我希望它们始终在同一个 CPU 上。
  • 迄今为止最简单和最有效的方法是使用单个进程。你能重组你的代码来做到这一点吗?

标签: c linux performance fork scheduling


【解决方案1】:

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

【讨论】:

  • 整个项目是将库作为单独的进程运行(以安全的名义)。无论如何,我不再从事那个项目,所以会结束这个问题。谢谢大家的建议和帮助。
【解决方案2】:

帮派调度有帮助吗?然后,父母和孩子将被共同安排。

【讨论】:

  • 我想让父母和孩子保持在同一个核心上,因为它们经常传递缓冲区,如果它们在不同的核心上运行,与它们在同一个核心上一起运行的情况相比,开销会显着增加.因此,即使它们是 Gang 计划的,这种复制开销仍然是一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多