Linuxでソケットを扱う際にプロセスをforkした方が良いのでしょうか？


オープンソースを見るとforkしていないものもあったように思います。  
forkするメリットとデメリットを教えていただけると助かります。




サーバ側でforkする意図ですが、一般的には非同期を実現する為に使います。  
HTTPサーバを処理する場合

  1. listenして
  2. acceptして
  3. acceptしたソケットからヘッダを読み取り
  4. bodyを読み取る

となりますが3以降は並列で動いて欲しい物です。そこでacceptしたらすぐにforkもしくはスレッドを起動してそちらに処理を預けます。そうする事で直ぐに次のacceptを処理する事が出来ます。  
これをしないと3や4をしている間、他のリクエストを処理出来なくなりパフォーマンスが悪くなります。  
ただしforkはリソースを多く必要とする(デメリット)為、スレッドを使ったり予めforkさせておいたプロセスにソケットを渡す事でオーバヘッドを減らす方法(prefork)もあります。また逆にforkするとacceptしたプロセスとは別の実行権限で処理出来るというメリットもあります。  
クライアントでforkする意図もだいたいの場合、HTTP処理をしている間に他の処理をやりたいという目的で行います。

