らしいというのは前から見聞きしていたのですが。
過去にも議論が繰りかえされ、ここ数年は仕様上しかたがないということで落ち着いているのかと思っていたのですが、最近になってもくすぶっている問題があるようです。
たとえばこれ↓。
Slow fork issue - Win x64
http://old.nabble.com/Slow-fork-issue---Win-x64-td19538601.html
cygwinのソースをチラ見してみると、どうやらfork.ccが該当するようです。
シグナルやプロセスを停めてからごにょごにょしているようなので重そうです。シェルがforkを使っているのかとか、裏を取らないといけないことも多そうです。
vforkについては、manpageにおかしなことが書いてありました。
Manpage of VFORK
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/vfork.2.html
バグ
Linux がこの過去の亡霊を復活させたことは、むしろ不幸と言うべきである。 BSD のマニュアルには、「このシステムコールは妥当なシステム共有機構が実装された場合には削除される。ユーザは vfork() のメモリ共有機能に依存するべきではない。何故ならば、このシステムコールが削除された場合には、それは fork(2) の同義語とされるからである。」と書かれている。
まぁアプリ開発者の私にはどうでもいいことです。
深追いする気もないので、簡単に行き先案内を書いておきます。
- make/configureからは多数の(外部)コマンドが呼び出される
- 外部コマンドはシェルからforkで実行される?
- cygwinのforkは遅い
→cygwin上でmake/configureの実行が遅い
forkの遅さを簡単に確認する1行(ワンライナー)
$ while (true); do date; done | uniq -c
表示される行の先頭の数字が大きいほどforkが軽いと考えてよいようです。
- cygwinのforkはfork.ccで実装されているぽい
夢のような解決法はないと思いますが、なんとかならんもんでしょうかね。
MinGW/MSYSなら大丈夫とかいう話は聞き飽きたので結構です。
Cygwinでの開発作業を効率化したいだけですので。
コメント