这实际上是一个两部分的问题。
- 当它本身只是 + 的包装时,为什么
posix_spawn()
比手写更快?fork()
exec()
posix_spawn()
fork()
exec()
- 为什么
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()
和n
prefix 是 normal fork()
。