スレッドとマルチプロセスの比較

More than 3 years have passed since last update.

半年間、MySQLを基礎からやり直すことにしたので、その間に勉強したことをQiitaに投稿していきます。


スレッドとマルチプロセスの大まかな違い

大きな違いとしては、子スレッドは親とヒープ(グローバルなプログラムデータ)を共有するのに対し、

子プロセスは共有しない


スレッドのメリット・デメリット


メリット


  • メモリ使用率が低い。

  • サーバグローバルデータにアクセスするのに高度なテクニックがいらない。

  • 同時実行スレッドによるデータ変更の際も、相互排除ロック(ミューテック)を使用して該当セクションを保護するだけで済む。

  • ヒープセグメントをコピーする必要が無いので、プロセスよりもずっと少ない時間で作成できる

  • スケジューラのコンテキストスイッチでカーネルが要する時間が、プロセスよりも少ない


デメリット


  • 1つのスレッドがクラッシュするとサーバ全体に影響が及んでしまう

  • プログラミングミスが起こりやすい

  • スレッドサーバでの同期バグ(共有アドレス空間による)

  • ミューテックス競合が起こると収拾がつかなくなる(過度なコンテキストスイッチ発生の原因になる)


マルチプロセスのメリット・デメリット


メリット


  • 不正なサーバプロセスがあってもサーバ全体へ影響が出ない

  • 1つの実行スレッドのみを頭に入れていればよいので、プログラミングミスが起きにくい

  • ファントムバグ(意図的に再現できないバグ)が起きる可能性が低い為、バグの再現が容易に行える

  • 個々のプロセスで専用のアドレス空間を持つ為、プロセス間での相互作用は大きくならない


デメリット


  • 子プロセスが分岐した場合、大きなメモリセグメントが不要にコピーされる可能性がある

  • プロセス間でデータを共有するのに手間がいり、サーバグローバルデータへのアクセスが面倒

  • プロセスの作成にカーネルにより多くのオーバヘッドを強いる

  • 親プロセスのデータセグメントをコピーしなければならない

  • プロセス間のコンテキストスイッチにより多くの時間を消費する


考察

接続ハンドラ間で、大量のデータを共有する必要がある(プログラムスキルが高い)場合は、スレッドサーバが向いてているかと個人的には思いました。