首页 > 解决方案 > 当 posix_spawn 只是 fork + exec 的包装器时,为什么它会更快?

问题描述

这实际上是一个两部分的问题。

  1. 当它本身只是 + 的包装时,为什么posix_spawn()比手写更快?fork()exec()posix_spawn()fork()exec()
  2. 为什么posix_spawn()POSIX_SPAWN_USEVFORK比正常手写慢的vfork()+ exec()

根据Ruby posix spawning library的工作,它似乎posix_spawn()提供了一致的吞吐量。我阅读了 glibc 的源代码,但我找不到任何明显的提供这种一致性的东西。有人可以向我解释吗?

我制作了一个小的测试源文件(对于这里来说太大,所以 GitHub),并让它运行大约 30 次 - 每次调用/bin/true几次(1000-10000 之间的随机数) - 然后将总时间除以总迭代次数。结果如下所示。它在没有附加任何附加功能的普通 Linux Mint 桌面上运行。

我收集了认为vfork() 是架构缺陷的手册页,但对于我的用例来说,它很好。

各种分叉机制图

在这里,v前缀是 usingvfork()nprefix 是 normal fork()

标签: clinuxforkvfork

解决方案


推荐阅读