1. ホーム
  2. c++

[解決済み] Windowsでfork()に最も近いものは何ですか?

2022-05-07 05:44:12

質問

質問がすべてを物語っているのでしょう。

Windowsでフォークしたい。一番似たような操作で、どう使えばいいのか。

どのように解決するのですか?

Cygwin は Windows 上で fork() の完全な機能を備えています。したがって、もしCygwinを使うことがあなたにとって許容できるのであれば、パフォーマンスが問題でない場合には、問題は解決します。

そうでなければ、Cygwinがどのようにfork()を実装しているかを見てみるといいでしょう。かなり古いCygwinのアーキテクチャより ドクター :

5.6. プロセスの作成 Cygwin の fork 呼び出しは、特に興味深いものです。 の上にうまくマッピングできないからです。 Win32のAPI。このため、非常に 正しく実装することは困難である。 現在、Cygwinのフォークは 非コピーオンライト実装 初期に存在したものと同じような UNIXのフレーバー

が発生した場合、まず 親プロセスが子プロセスをフォークする は、親が をCygwinプロセステーブルで 子です。次に、サスペンドされた 子プロセスは、Win32 CreateProcessを呼び出す。次に、親プロセスが プロセスは setjmp を呼び出して、自分自身の コンテキストへのポインタを Cygwin共有メモリ領域(共有 すべてのCygwinタスクの間で)。次に 子プロセスの.dataと.bssセクションの 自分のアドレス空間からコピーすることで を停止している子のアドレスに を使用します。子プロセスのアドレス空間 が初期化された後、子機が実行され、その間に 親はミューテックスで待機する。子 フォークされたことを発見し 保存されたジャンプバッファを使用してロングジャンプを行う。 次に、子プロセスはミューテックスを設定し 親が待機している間、ブロック を別のミューテックスに変更する。これは 親がそのスタックとヒープをコピーする を子機に移し、その後 子プロセスのミューテックスを解放する。 を待機させ、フォークから戻る。 を呼び出します。最後に、子プロセスは 最後のミューテックスでブロックされ 渡されたメモリマップド領域 共有領域経由で戻り フォーク自身

というアイデアがありますが forkの実装を高速化するために コンテキストの数を減らす 親子間のスイッチ プロセスでは、forkはほぼ確実に Win32では常に非効率的です。 幸いなことに、ほとんどの状況において が提供する spawn 系のコール。 Cygwinは フォーク/エグゼックのペアは、ほんの少しで の労力を必要とします。これらの呼び出しは Win32 API の その結果 ははるかに効率的です。より効率的です。 を呼び出すようにコンパイラのドライバプログラムが forkの代わりにspawnを使用するのは些細なことでした。 を変更し、コンパイルが向上しました。 で20~30%のスピードアップを実現しました。 をテストしました。

ただし、spawnとexecには、それぞれ があります。なぜなら で実際に実行する方法はありません。 Win32では、Cygwinは独自に プロセスID(PID)です。その結果 プロセスが複数のexec を呼び出すと、複数のWindows PIDは、1つのCygwin PIDです。場合によっては、それぞれのスタブが これらのWin32プロセスが滞留することがあります。 実行されたCygwinを待つ プロセスが終了します。

大変そうですね(笑) そうそう、スルスル動くんですよ。

EDIT: ドキュメントは古いです、この優れたを参照してください。 回答 更新のため