gpt4 book ai didi

c++ - Windows 与 fork() 最接近的东西是什么?

转载 作者:行者123 更新时间:2023-11-30 16:35:28 25 4
gpt4 key购买 nike

我想这个问题已经说明了一切。

我想在 Windows 上进行 fork 。最相似的操作是什么以及如何使用它。

最佳答案

Cygwin Windows 上有功能齐全的 fork()。因此,如果您可以接受使用 Cygwin,那么在性能不是问题的情况下问题就解决了。

否则你可以看看Cygwin是如何实现fork()的。来自相当古老的 Cygwin 架构 doc :

5.6. Process Creation The fork call in Cygwin is particularly interesting because it does not map well on top of the Win32 API. This makes it very difficult to implement correctly. Currently, the Cygwin fork is a non-copy-on-write implementation similar to what was present in early flavors of UNIX.

The first thing that happens when a parent process forks a child process is that the parent initializes a space in the Cygwin process table for the child. It then creates a suspended child process using the Win32 CreateProcess call. Next, the parent process calls setjmp to save its own context and sets a pointer to this in a Cygwin shared memory area (shared among all Cygwin tasks). It then fills in the child's .data and .bss sections by copying from its own address space into the suspended child's address space. After the child's address space is initialized, the child is run while the parent waits on a mutex. The child discovers it has been forked and longjumps using the saved jump buffer. The child then sets the mutex the parent is waiting on and blocks on another mutex. This is the signal for the parent to copy its stack and heap into the child, after which it releases the mutex the child is waiting on and returns from the fork call. Finally, the child wakes from blocking on the last mutex, recreates any memory-mapped areas passed to it via the shared area, and returns from fork itself.

While we have some ideas as to how to speed up our fork implementation by reducing the number of context switches between the parent and child process, fork will almost certainly always be inefficient under Win32. Fortunately, in most circumstances the spawn family of calls provided by Cygwin can be substituted for a fork/exec pair with only a little effort. These calls map cleanly on top of the Win32 API. As a result, they are much more efficient. Changing the compiler's driver program to call spawn instead of fork was a trivial change and increased compilation speeds by twenty to thirty percent in our tests.

However, spawn and exec present their own set of difficulties. Because there is no way to do an actual exec under Win32, Cygwin has to invent its own Process IDs (PIDs). As a result, when a process performs multiple exec calls, there will be multiple Windows PIDs associated with a single Cygwin PID. In some cases, stubs of each of these Win32 processes may linger, waiting for their exec'd Cygwin process to exit.

听起来工作量很大,不是吗?是的,它太慢了。

编辑:该文档已过时,请参阅这个优秀的 answer更新内容

关于c++ - Windows 与 fork() 最接近的东西是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48925070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com