半年間、MySQLを基礎からやり直すことにしたので、その間に勉強したことをQiitaに投稿していきます。
スレッドとマルチプロセスの大まかな違い
大きな違いとしては、子スレッドは親とヒープ(グローバルなプログラムデータ)を共有するのに対し、
子プロセスは共有しない
スレッドのメリット・デメリット
メリット
- メモリ使用率が低い。
- サーバグローバルデータにアクセスするのに高度なテクニックがいらない。
- 同時実行スレッドによるデータ変更の際も、相互排除ロック(ミューテック)を使用して該当セクションを保護するだけで済む。
- ヒープセグメントをコピーする必要が無いので、プロセスよりもずっと少ない時間で作成できる
- スケジューラのコンテキストスイッチでカーネルが要する時間が、プロセスよりも少ない
デメリット
- 1つのスレッドがクラッシュするとサーバ全体に影響が及んでしまう
- プログラミングミスが起こりやすい
- スレッドサーバでの同期バグ(共有アドレス空間による)
- ミューテックス競合が起こると収拾がつかなくなる(過度なコンテキストスイッチ発生の原因になる)
マルチプロセスのメリット・デメリット
メリット
- 不正なサーバプロセスがあってもサーバ全体へ影響が出ない
- 1つの実行スレッドのみを頭に入れていればよいので、プログラミングミスが起きにくい
- ファントムバグ(意図的に再現できないバグ)が起きる可能性が低い為、バグの再現が容易に行える
- 個々のプロセスで専用のアドレス空間を持つ為、プロセス間での相互作用は大きくならない
デメリット
- 子プロセスが分岐した場合、大きなメモリセグメントが不要にコピーされる可能性がある
- プロセス間でデータを共有するのに手間がいり、サーバグローバルデータへのアクセスが面倒
- プロセスの作成にカーネルにより多くのオーバヘッドを強いる
- 親プロセスのデータセグメントをコピーしなければならない
- プロセス間のコンテキストスイッチにより多くの時間を消費する
考察
接続ハンドラ間で、大量のデータを共有する必要がある(プログラムスキルが高い)場合は、スレッドサーバが向いてているかと個人的には思いました。