首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`posix_spawn`性能

`posix_spawn`性能
EN

Stack Overflow用户
提问于 2017-03-06 11:09:56
回答 3查看 1.8K关注 0票数 2

我正在编写一个小程序,它是一个服务器,它生成它的客户端程序(本地,而不是通过网络),并在它们之间做有趣的事情。虽然我使用的主要操作系统是Linux,但我希望它能在包括OSes在内的其他OSes上运行。有forkexec来完成这项工作,但是当我通过cygwin将程序移植到Windows时,我不希望在cygwin中实现的糟糕的fork启动,它实际上调用CreateProcess并使用具有共享内存互斥体的setjmp/longjmp将当前进程的内存区域复制到新进程,所有这些都是为了被另一个程序(exec)所取代。在阅读cygwin的FAQ页面时,我发现了spawn.h及其posix_spawn,它在windows中基本上看起来像CreatePorcess(Ex)。这似乎是一个新的特征(.我指的不是最初的UNIX系统功能之一),所以我有一些问题要问。

  1. 它实施得好,广泛吗?(我在互联网上看到一些帖子没有在他/她的系统下定义。)
  2. 在Linux中使用posix_spawn而不是fork/exec,我能期待性能的改善或恶化吗?
  3. 为什么posix_spawn不像fork/exec那样为人们所知,也更少被使用,尽管它自1999年以来一直是标准的?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-06 13:35:00

posix_spawn没有得到广泛的实现,但无论如何,您应该在可能的情况下使用它。

  • 如果一个平台缺乏它,那么就可以很容易地使用一个插入式替换,只做分叉和执行。
  • 如果有一个“本地”/optimal实现可用(或者作为系统的一部分,或者是特定于平台的插入),那么对于fork昂贵的系统来说,它将产生很大的不同,对于根本无法执行fork的系统(MMU-没有fork,等等)则会有更大的不同。
  • 即使在fork是本机和“快速”的系统上,如果父服务器有大量虚拟映射,它仍然会相当慢,而且即使对于一个小父级的posix_spawn,它也比最优的posix_spawn慢一些。有关一些发现,请参阅Twitter的以下内容:https://twitter.com/RichFelker/status/602313644026761216

至于为什么它没有得到更广泛的使用/实现,它可能是一个不为人所知的混合体,也可能是一个相当粗糙、不受欢迎的面向对象的API设计。

票数 0
EN

Stack Overflow用户

发布于 2017-03-06 11:45:54

  1. 它实施得好,广泛吗?(我在互联网上看到一些帖子没有在他/她的系统下定义。)

高级实时XSI选项组是可选的,因此您可以遵守POSIX,而不是实现它。但是对于GNU/Linux,你可以指望现在它是可用的。

  1. 在Linux中,我可以期望使用posix_spawn而不是fork/exec来改善或降低性能吗?

可能是的,对于大进程来说,相当一段时间可能会花在复制页面表上,而只能在exec时被丢弃。posix_spawn的实现,如musl或glibc的实现,在可能的情况下使用vfork(2) (或直接clone(2) )来避免这种情况。对于像cygwin这样的系统,fork模拟,成本相当高,posix_spawn大大减少了开销。

  1. 为什么尽管自1999年以来posix_spawn已成为标准,但它的知名度和使用量却不如fork/exec?

我猜是惯性。

票数 2
EN

Stack Overflow用户

发布于 2017-03-06 11:19:48

根据Linux手册页,它出现在2000年发布的glibc版本2.2中,该实现符合POSIX.1-2001和POSIX.1-2008。我希望它至少在任何至少使用这个glibc版本的平台上都能得到支持,因为它的行为至少可以在这些平台上用fork + exec来模拟。

在Linux上,如果使用的是fork/exec而不是fork,您可能期望在性能上有所提高。

当以下任一项为真时,则使用vfork(2)而不是fork(2)创建子进程:

  • 由attrp指向的属性对象的派生标志元素包含特定于GNU的标志POSIX_SPAWN_USEVFORK;或
  • file_actions为NULL,由attrp指向的属性对象的派生标志元素不包含POSIX_SPAWN_SETSIGMASK、POSIX_SPAWN_SETSIGDEF、POSIX_SPAWN_SETSCHEDPARAM、POSIX_SPAWN_SETSCHEDULER、POSIX_SPAWN_SETPGROUP或POSIX_SPAWN_RESETIDS。

换句话说,如果调用方请求,或者在exec(3)请求文件之前,子程序中没有预期的清理,则使用v叉(2)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42624073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档