- 最も単純なモデル
- 並行処理はせず、逐次に処理するだけ
- accept、read、writeなどがI/Oが完了するまで処理をブロックする
TIPS: Perlの場合は、HTTP::Server::PSGIがよい実装例。
MPM。
- クライアントからの接続毎にプロセスをfork(分岐)して子プロセスを生成し、それにリクエスト処理を任せる
- あらかじめ複数のプロセスを生成してクライアントの接続に備えている
- 同時接続数分だけのプロセスをメモリ上に確保しておくため、接続がなくても負担が高い
TIPS: forkは、メモリ上のプロセスのアドレス空間を丸ごと別のアドレス空間にコピーする。そのため、コードが複雑になりにくいというメリットがある。
TIPS: PerlならStarlet、RubyならUnicornなどがこのモデルに該当する。
- クライアントからの接続毎にスレッドを生成して処理する
- 複数のスレッドがメモリアドレス空間を共有しているため、リソース競合をプログラマが意識して避けなければならない
TIPS: スレッドは生成元のプロセスとアドレス空間を共有するため、プロセスのforkのように丸ごとアドレス空間からコピーすることはなく、スレッド生成のコストは一般にプロセス生成より小さいと言われている。
- node.jsに代表される
- クライアントからの接続管理もリクエスト処理も、イベントループにより1つのスレッドで実行する
- 接続数が増えてもプロセス数やスレッド数は増えず、高速に処理を行うことができる