我正在编写一个小程序,它是一个服务器,它生成它的客户端程序(本地,而不是通过网络),并在它们之间做有趣的事情。虽然我使用的主要操作系统是Linux,但我希望它能在包括OSes在内的其他OSes上运行。有fork和exec来完成这项工作,但是当我通过cygwin将程序移植到Windows时,我不希望在cygwin中实现的糟糕的fork启动,它实际上调用CreateProcess并使用具有共享内存互斥体的setjmp/longjmp将当前进程的内存区域复制到新进程,所有这些都是为了被另一个程序(exec)所取代。在阅读cygwin的FAQ页面时,我发现了spawn.h及其posix_spawn,它在windows中基本上看起来像CreatePorcess(Ex)。这似乎是一个新的特征(.我指的不是最初的UNIX系统功能之一),所以我有一些问题要问。
posix_spawn而不是fork/exec,我能期待性能的改善或恶化吗?posix_spawn不像fork/exec那样为人们所知,也更少被使用,尽管它自1999年以来一直是标准的?发布于 2017-03-06 13:35:00
posix_spawn没有得到广泛的实现,但无论如何,您应该在可能的情况下使用它。
fork昂贵的系统来说,它将产生很大的不同,对于根本无法执行fork的系统(MMU-没有fork,等等)则会有更大的不同。fork是本机和“快速”的系统上,如果父服务器有大量虚拟映射,它仍然会相当慢,而且即使对于一个小父级的posix_spawn,它也比最优的posix_spawn慢一些。有关一些发现,请参阅Twitter的以下内容:https://twitter.com/RichFelker/status/602313644026761216至于为什么它没有得到更广泛的使用/实现,它可能是一个不为人所知的混合体,也可能是一个相当粗糙、不受欢迎的面向对象的API设计。
发布于 2017-03-06 11:45:54
高级实时XSI选项组是可选的,因此您可以遵守POSIX,而不是实现它。但是对于GNU/Linux,你可以指望现在它是可用的。
可能是的,对于大进程来说,相当一段时间可能会花在复制页面表上,而只能在exec时被丢弃。posix_spawn的实现,如musl或glibc的实现,在可能的情况下使用vfork(2) (或直接clone(2) )来避免这种情况。对于像cygwin这样的系统,fork是模拟,成本相当高,posix_spawn大大减少了开销。
我猜是惯性。
发布于 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)创建子进程:
换句话说,如果调用方请求,或者在exec(3)请求文件之前,子程序中没有预期的清理,则使用v叉(2)。
https://stackoverflow.com/questions/42624073
复制相似问题