

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


CC BY-SA 3.0
2015-04-12T04:19:42.047
9065
2015-04-13T02:15:07.427
9072
question
linux socket
Linuxでソケットを扱う際にプロセスをforkした方が良いのでしょうか？


既にコメントついていますが、一般的に  
「サーバソフト」と呼ばれるものは `fork` するように作られている  
「クライアントソフト」と呼ばれるものは `fork` しないで作られている  
ものが多いと（個人的に）思います。  
daemon として動作させる前提のソフトは `fork` することが必須です。

# `fork` するメリット

プロセスが独立します。親だけでなく同じプロセスを親に持つ兄弟たちとも独立します。  
プロセスは OS レベルで保護されるのでサーバソフト自分自身のバグなどがあっても  
・異常終了するのは自分だけで兄弟たちを巻き込みません（サービスが安定します）  
・兄弟たちに自分の情報を漏らしにくくなります（セキュリティ保護が向上します）  
ということでサーバソフト的には `fork` することにメリットがあります。

# `fork` するデメリット

・ `fork` しない場合より余計に資源を使います（メモリ、ハンドルなど）  
・プログラムが `fork`/`exec` するので１手間増えます (`setuid`/`setgid` などを伴えばもう１手間２手間)  
・デバッガで追いにくくなります（異プロセスをデバッグする必要が生じます）  
ということでクライアントソフト的にはわざわざ `fork` する理由がほとんどありません。

なのでプログラムの用途・目的に応じて使いわけるだけのことです。


CC BY-SA 3.0
2015-04-13T01:39:00.590
9087
2015-04-13T01:39:00.590
8589
9065
answer


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

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

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


CC BY-SA 3.0
2015-04-13T02:15:07.427
9089
2015-04-13T02:15:07.427
440
9065
answer