【问题标题】:time taken by forked child process分叉子进程花费的时间
【发布时间】:2012-04-22 08:23:31
【问题描述】:

这是我之前的question 的续集。我正在使用 fork 创建子进程。在孩子内部,我正在命令运行如下进程:

if((childpid=fork())==0)
{
system("./runBinary ");
exit(1)
}

我的 runBinary 具有测量从开始到结束所需时间的功能。

令我惊讶的是,当我直接在命令行上运行 runBinary 时,大约需要 60 秒。但是,当我将它作为子进程运行时,它需要更多,比如 ~75 或更多。有什么我可以做或目前做错的事情导致了这种情况吗?

提前感谢您的帮助。 更多细节:我在 linux RHEL 服务器上运行,有 24 个内核。我正在测量 CPU 时间。一次,我只 fork 8 个孩子(按顺序),每个孩子都绑定到不同的核心,使用任务集(代码中未显示)。除了我自己的程序,系统没有加载。

【问题讨论】:

  • 在孩子退出后,你沉睡的父进程可能需要 15 秒才能被 o/s 唤醒?
  • @JonathanLeffler 你能告诉我如何确认吗?谢谢
  • @sarnold 实际上是 runBinary,它本身正在测量时间。
  • 如果 runBinary 正在计时,则不清楚唤醒睡眠父母所花费的时间是问题所在。鉴于有关 24 核机器的更新并使用 taskset(),然后尝试在不使用 taskset() 或 CPU 绑定的情况下运行它。 runBinary 程序本身是多线程的吗?当您从自己的二进制文件运行 8 时,是否会比从命令行一次运行它们时遇到更多的争用? (你确实从命令行运行 8,不是吗?)
  • 性能是否取决于/proc/sys/kernel/sched_autogroup_enabled 变量?

标签: c++ system fork


【解决方案1】:

system() 函数用于调用 shell。您可以在其中执行任何操作,包括运行脚本。这为您提供了很大的灵活性,但也有代价:您正在加载一个外壳,然后在其中运行二进制文件。虽然我不认为加载 shell 会造成这么大的时间差异(毕竟 15 秒很多),因为它似乎不需要 - 只是为了运行应用程序 - 尝试使用来自 @改为 987654321@family。

【讨论】:

  • 谢谢。你的回答很有说服力。你认为 exec 家族更快吗?我没有使用 execvp 的原因是在系统中我可以执行 system("./Binary argument1 argument2");,而在 execvp 中我不能这样做。你能告诉我。
  • 好吧,只是不必加载 shell 并解释给定的命令行应该可以提高速度。关于命令行,我没看懂,你说什么不能做?您可以将参数传递给它,唯一的额外工作是您必须将参数放在一个数组中 - 如果使用 execv 变体 - 或者至少将二进制名称放在单独的字符串中 - 如果使用 execl 变体。例如,这些事情可以通过 strtok 来完成。
【解决方案2】:

如果不分析应用程序,如果派生的父进程具有较大的内存空间,您可能会发现尝试派生进程本身并尝试复制内存空间会花费时间。

这在 Red Hat Enterprise Linux 6 中不是问题,但在 Red Hat Enterprise Linux 5 的早期版本中存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    相关资源
    最近更新 更多