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()
  • 根据这项工作,posix_spawn()似乎提供了一致的吞吐量。我阅读了glibc的源代码,但是我找不到任何明显的东西来提供这种一致性。有人能给我解释一下吗

    我做了一个小的(对于这里来说太大了,所以GitHub),让它运行大约30次——每次调用
    /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()不会复制内存页表,因此当父进程继续运行时,会减少很多页面错误。