C 为什么posix#U在fork+;执行官?
这实际上是一个由两部分组成的问题C 为什么posix#U在fork+;执行官?,c,linux,fork,vfork,C,Linux,Fork,Vfork,这实际上是一个由两部分组成的问题 为什么posix_spawn()比手写fork()+exec()快,而它本身只是fork()+exec()的包装器 为什么posix_spawn()与posix_spawn_USEVFORK的速度比普通手写vfork()+exec()慢 根据这项工作,posix_spawn()似乎提供了一致的吞吐量。我阅读了glibc的源代码,但是我找不到任何明显的东西来提供这种一致性。有人能给我解释一下吗 我做了一个小的(对于这里来说太大了,所以GitHub),让它运行大约3
posix_spawn()
比手写fork()
+exec()
快,而它本身只是fork()
+exec()
的包装器posix_spawn()
与posix_spawn_USEVFORK
的速度比普通手写vfork()
+exec()
慢/bin/true
几次(1000-10000之间的随机数)——然后将总时间除以总迭代次数。结果如下所示。它运行在一个普通的LinuxMint桌面上,没有任何附加功能
我收集到的手册页认为vWork()
是一个架构缺陷,但对于我的用例来说,还可以
这里,
v
前缀使用vfork()
,n
前缀是普通的fork()
ruby库中的代码将posix_spawn(使用vfork)与fork+exec进行比较。我怀疑如果改用vfork+exec,它会得到与posix_spawn更相似的结果。posix_spawn仍然比vfork+exec要花更多的时间。@不,这对我问题的第二部分来说只有部分意义。但是我真的很想知道posix_spawn是如何变得更好的。cfork()不会复制内存页表,因此当父进程继续运行时,会减少很多页面错误。