[解決済み] Windowsでfork()に最も近いものは何ですか?
質問
質問がすべてを物語っているのでしょう。
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: ドキュメントは古いです、この優れたを参照してください。 回答 更新のため
関連
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++の余分な資格エラー
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] Windows OS の Code::Blocks エディタで fork() が未定義参照である。
-
[解決済み】forkとexecの違いについて