我想这个问题已经说明了一切。
我想在 Windows 上 fork。最相似的操作是什么以及如何使用它。
Cygwin http://www.cygwin.com/Windows 上有功能齐全的 fork()。因此,如果您可以接受使用 Cygwin,那么在性能不是问题的情况下问题就解决了。
否则你可以看看Cygwin是如何实现fork()的。来自相当古老的 Cygwin 架构doc http://www.redhat.com/support/wpapers/cygnus/cygnus_cygwin/architecture.html:
5.6.流程创建
Cygwin 中的 fork 调用特别有趣
因为它不能很好地映射到
Win32 API。这使得它非常
很难正确实施。
目前,Cygwin 叉子是
非写时复制实现
类似于早期出现的情况
UNIX 的风格。
当
父进程fork出一个子进程
是父进程初始化一个空间
在 Cygwin 进程表中
孩子。然后它创建一个暂停的
使用 Win32 的子进程
创建进程调用。接下来,家长
进程调用setjmp来保存自己的
context 并设置一个指向 this 的指针
Cygwin 共享内存区域(共享
在所有 Cygwin 任务中)。然后它填充
在孩子的 .data 和 .bss 部分
通过从自己的地址空间复制
进入被暂停孩子的地址
空间。孩子的地址空间之后
初始化后,子进程运行
父进程等待互斥锁。孩子
发现它已经被分叉并且
使用保存的跳转缓冲区进行长跳转。
然后孩子将互斥体设置为
父母正在等待并阻止
另一个互斥体。这是信号
父级复制其堆栈和堆
进入孩子体内,之后
释放子进程的互斥体
等待并从叉口返回
称呼。终于,孩子从梦中醒来
阻塞在最后一个互斥体上,重新创建
传递给它的任何内存映射区域
通过共享区域,并从
分叉本身。
虽然我们对如何做有一些想法
加快我们的分叉实施速度
减少上下文的数量
在父子之间切换
进程,fork 几乎肯定会
在Win32下总是效率低下。
幸运的是,在大多数情况下
提供的调用的生成家族
Cygwin 可以替代
fork/exec 对只有一点点
努力。这些调用清晰地映射在顶部
Win32 API 的。结果,他们
效率更高。改变
编译器调用的驱动程序
使用spawn代替fork是一件微不足道的事情
改变并增加编译
速度提高百分之二十到百分之三十
我们的测试。
然而,spawn 和 exec 展示了他们的
自己的一系列困难。因为那里
没有办法在下面进行实际的执行
Win32、Cygwin 必须发明自己的
进程 ID (PID)。结果,当
一个进程执行多个exec
调用时,会有多个Windows
与单个 Cygwin 关联的 PID
PID。在某些情况下,每个的存根
这些 Win32 进程可能会持续存在,
等待他们的 exec'd Cygwin
进程退出。
听起来工作量很大,不是吗?是的,它很慢。
编辑:该文档已过时,请参阅这个优秀的answer https://stackoverflow.com/questions/985281/what-is-the-closest-thing-windows-has-to-fork/985525#985525更新
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)