Skip to content

Instantly share code, notes, and snippets.

@mesummery
Last active October 1, 2017 04:22
Show Gist options
  • Save mesummery/301a94791b08a0ee4e04e5fccc104ec6 to your computer and use it in GitHub Desktop.
Save mesummery/301a94791b08a0ee4e04e5fccc104ec6 to your computer and use it in GitHub Desktop.

Webサーバアーキテクチャ

シリアルモデル

  • 最も単純なモデル
  • 並行処理はせず、逐次に処理するだけ
  • accept、read、writeなどがI/Oが完了するまで処理をブロックする

TIPS: Perlの場合は、HTTP::Server::PSGIがよい実装例。

マルチプロセスモデル

MPM。

  • クライアントからの接続毎にプロセスをfork(分岐)して子プロセスを生成し、それにリクエスト処理を任せる
  • あらかじめ複数のプロセスを生成してクライアントの接続に備えている
  • 同時接続数分だけのプロセスをメモリ上に確保しておくため、接続がなくても負担が高い

TIPS: forkは、メモリ上のプロセスのアドレス空間を丸ごと別のアドレス空間にコピーする。そのため、コードが複雑になりにくいというメリットがある。
TIPS: PerlならStarlet、RubyならUnicornなどがこのモデルに該当する。

マルチスレッドモデル

  • クライアントからの接続毎にスレッドを生成して処理する
  • 複数のスレッドがメモリアドレス空間を共有しているため、リソース競合をプログラマが意識して避けなければならない

TIPS: スレッドは生成元のプロセスとアドレス空間を共有するため、プロセスのforkのように丸ごとアドレス空間からコピーすることはなく、スレッド生成のコストは一般にプロセス生成より小さいと言われている。

イベント駆動モデル

  • node.jsに代表される
  • クライアントからの接続管理もリクエスト処理も、イベントループにより1つのスレッドで実行する
  • 接続数が増えてもプロセス数やスレッド数は増えず、高速に処理を行うことができる
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment