Webサーバの複数リクエスト処理には2種類の方法がある

Webサーバは、複数クライアントからのリクエストに同時並行で応答しないといけません。

同時並行で応答できるようになっていなければ、
1つのリクエストを処理している間は他のリクエストを受け付けることができません。
それでは多くのユーザに機能を提供できません。

複数リクエストの処理には、大きく分けてprefork型とイベント駆動型の2種類あります。

 

【 prefork型 】

OSは一つ一つのプロセスを高速に切り替えることで、
あたかも複数のプロセスが同時並行で実行されているかのように振舞います。


このOSが持つプロセスの仕組みを利用して
複数クライアントからのリクエストを同時並行で処理するのがprefork型です。

Webサーバは複数のプロセスを生成して、1つのプロセスが1つのコネクションを処理します。
プロセスの切り替えはOSがやってくれるのでWebサーバはそれぞれのプロセスで自分が担当している
リクエストの処理だけを担当すればよいことになります。


prefork型を作用している代表的なWebサーバにはApache HTTP Serverがあります。

prefork型はプロセスを使って処理をするために、
多くのリクエストを同時に処理するためには多くのプロセスを立ち上げる必要があります

しかしプロセス数が多くなるとOSによるプロセス切り替えの処理の割り合いが増えてしまい
コンピュータの処理能力が十分高くてもリクエストの処理にコンピュータの処理能力を活用できない
という問題がありました。
Webの発展によりリクエスト数が増え、コンピュータの処理能力が上がってもprefork型では十分な処理能力を提供できなくなりました。これをC10K問題(クライアント1万台問題)といいます。

この問題を解決するためにイベント駆動型のWebサーバが登場しました。

 

【 イベント駆動型 】

prefork型のように1つのプロセスで1つのリクエストを処理するやり方では、
プロセスが増えたときに効率よく処理ができなくなっていきました。

そこで1つのプロセスで複数のリクエストを処理するようにしたのがイベント駆動型です。

1つのプロセスで複数のリクエストを処理できるようにしたのがイベント駆動型です。
そうすることでプロセスの数が少なくなり、
OSによるプロセス切り替えがボトルネックになることはありません。

イベント駆動型では、1つのプロセスで複数のリクエストを処理するために非同期I/Oを使用します。

ネットワークやディスクとのデータのやり取りはCPUから見ると低速で、待ち時間が発生します。
低速なデバイスとのデータのやり取りの待ち状態のときに別の処理を実行するのが非同期I/Oです。

別の処理を実行している間は、データのやり取りの進行状況は分かりませんから、
データ受信をイベントとして受け取り処理を切り替えます。
これがイベント駆動型です。

イベント駆動型のWebサーバの登場により、
1台のPCでより多くのクライアントへ対応できるようになりました。

イベント駆動が他を採用している代表的なWebサーバにはnginxがあります、