【问题标题】:Why does newer glibc implement posix_spawn with vfork instead of fork?为什么较新的 glibc 使用 vfork 而不是 fork 实现 posix_spawn?
【发布时间】:2018-12-28 08:54:28
【问题描述】:

我正在跟踪 glibc 2.17 和 glibc 2.27 中的 posix_spawn 源代码。

(glibc 2.17:sysdeps/posix/spawni.c)

(glibc 2.27:sysdeps/unix/sysv/linux/spawni.c)

我发现 glibc 2.17 根据标志和文件操作使用 vfork 或 fork。

我猜这是由于多线程安全或竞争条件造成的。

但在 glibc 2.27 中,它只使用 vfork 来创建子进程。

为什么 glibc 会改变实现方式?

较新的 linux 内核是否能更好地保护 vfork 免受竞争条件的影响?

【问题讨论】:

标签: linux-kernel fork race-condition glibc vfork


【解决方案1】:

vfork 对于大型进程来说比fork 效率要高得多,因为根本不需要复制地址空间。最初,有人担心正确的取消处理需要在存在文件操作的情况下使用fork,但最终确定当前基于vfork 的实现已经足够了。

vfork 在 qemu-user 和微软的仿真中仍然存在问题,但是使用posix_spawn 时通常看不到错误,因为它实际上并没有使用vfork,而是vfork 风格的clone 系统使用单独的堆栈调用,这样即使父进程没有正确暂停,子进程中的堆栈也不会被破坏。

一些具有背景信息的资源:

【讨论】:

    猜你喜欢
    • 2016-09-07
    • 2015-05-06
    • 2011-05-14
    • 1970-01-01
    • 2022-08-10
    • 2021-06-07
    • 2017-01-26
    • 2018-08-05
    • 2021-06-05
    相关资源
    最近更新 更多