WebサーバーはどのようにしてIPアドレスを「リッスン」し、割り込みまたはポーリングしますか?


87

Webサーバーの詳細を理解しようとしています。Apacheなどのサーバーが継続的に新しいリクエストをポーリングしているのか、それとも何らかの割り込みシステムで動作するのか疑問に思っています。割り込みの場合、割り込みを引き起こしているのはネットワークカードドライバーですか?


1
理解すべきキーワードは"server"です。サーバー-クライアントモデル(マスター-スレーブモデル)では、サーバーはクライアントからの要求を待ちます。これらの要求は、サービスが必要なイベントです。Webサーバーはアプリケーションプログラムです。あなたの質問は、関連する概念を同じ抽象化層に保持するのではなく、アプリケーションSWとHWの用語(割り込みやNICなど)を組み合わせたものです。NICドライバーは実際には時々ポーリングを使用する場合があります。たとえば、Linux NAPIドライバーはパケットのフラッドがある場合にポーリングに回帰します。しかし、それはイベント処理アプリケーションSWとは無関係です。
おがくず14年

1
@sawdust非常に興味深い。質問は本当にSWとHWのプロセスとの間の接続を理解するためのものです
user2202911

1
これは、コマンドライン(および他のGUI)プログラムがキーボードをリッスンする方法に非常に似ています。特に、カーネルがキーボードデバイスからデータを受信し、ウィンドウマネージャーに渡すステップを持っているウィンドウシステムでは、フォーカスを持っているウィンドウを識別し、そのウィンドウにデータを渡します。
Gマン14

@ G-Man:ええ、そうですね。実際には、ほとんどのタイピストは1 Gbit / sで入力しません。これは、2つの異なるアーキテクチャを持つことを正当化します。1つはクリーンで柔軟性があり、低速で、もう1つは不器用だが高速です。
MSalters

回答:


181

簡単な答えは、ある種の割り込みシステムです。基本的に、これらはブロッキングI / Oを使用します。つまり、新しいデータを待っている間、スリープ(ブロック)します。

  1. サーバーはリッスンソケットを作成し、新しい接続を待つ間ブロックします。この間、カーネルはプロセスを割り込み可能なスリープ状態にし、他のプロセスを実行します。これは重要なポイントです。プロセスポーリングを継続的に行うと、CPUが無駄になります。カーネルは、実行する作業があるまでプロセスをブロックすることにより、システムリソースをより効率的に使用できます。

  2. 新しいデータがネットワークに到着すると、ネットワークカードは割り込みを発行します。

  3. ネットワークカードから割り込みが発生すると、カーネルはネットワークカードドライバーを介して、ネットワークカードから新しいデータを読み取り、メモリに保存します。(これは迅速に行う必要があり、通常は割り込みハンドラー内で処理されます。)

  4. カーネルは、新しく到着したデータを処理し、それをソケットに関連付けます。そのソケットでブロックしているプロセスは実行可能とマークされ、実行可能になります。必ずしもすぐに実行されるとは限りません(カーネルが他のプロセスを実行することを決定する場合があります)。

  5. 余暇に、カーネルはブロックされたWebサーバープロセスを起動します。(現在は実行可能であるため。)

  6. Webサーバープロセスは、時間が経過していないかのように実行を続けます。そのブロッキングシステムコールが戻り、新しいデータを処理します。次に...手順1に進みます。


18
カーネルとWebサーバープロセスを明確に区別するために+1。
ラッセルボロゴーブ14年

13
これを非常に明確かつ簡単に要約できるほど複雑なものは信じられませんが、あなたはそれをしました。+1
ブランドン14年

8
+1すばらしい回答。また、2から3の間の手順は、最新のNIC、OS、およびドライバーではもう少し複雑になります。たとえば、Linux上のNAPIでは、パケットは実際には割り込みコンテキストで受信されません。代わりに、カーネルは「OK NIC、データがあることを理解しました。バグを止めて(割り込みソースを無効にしてください)、すぐに戻ってこのパケット到着する可能性のある後続のパケットを取得します」と言います。
ジョナサンラインハート14年

8
ちょっとした注意:ブロックする必要はありません。サーバープロセスがリッスンソケットを作成すると、カーネルはその内部でブロックされていなくても、そのポートでSYNを受け入れますaccept。それらは(幸運なことに、または完全にダメでしょう!)独立した、非同期に実行されるタスクです。接続が入ると、接続はキューに入れられ、そこacceptからプルされます。存在しない場合のみ、ブロックします。
デイモン14年

3
「ネットワークカードから新しいデータを読み取り、メモリに保存します(これは迅速に実行する必要があり、通常は割り込みハンドラ内で処理されます。)」直接メモリアクセスでは実行されませんか?
Siyuanレン14年

9

かなり多くの「より低い」詳細があります。

まず、カーネルにはプロセスのリストがあり、いつでもこれらのプロセスの一部は実行中であり、一部は実行されていないことを考慮してください。カーネルは、実行中の各プロセスにCPU時間のスライスを許可し、それを中断して次のプロセスに移動します。実行可能なプロセスがない場合、カーネルはおそらくHLTなどの命令をCPUに発行し、ハードウェア割り込みが発生するまでCPUを一時停止します。

サーバー内のどこかに、「何かすることがあります」というシステムコールがあります。これを行う方法には、大きく2つのカテゴリがあります。Apacheの場合accept、おそらくポート80でリッスンしているApacheが以前に開いたソケットを呼び出します。カーネルは接続試行のキューを維持し、TCP SYNを受信するたびにそのキューに追加します。カーネルがTCP SYNを受信したことをどのように認識するかは、デバイスドライバーによって異なります。多くのNICでは、ネットワークデータを受信したときにおそらくハードウェア割り込みが発生します。

accept次の接続開始を返すようカーネルに要求します。キューが空ではなかった場合は、acceptすぐに戻ります。キューが空の場合、プロセス(Apache)は実行中のプロセスのリストから削除されます。後で接続が開始されると、プロセスが再開されます。これは「ブロック」と呼ばれます。これを呼び出すプロセスにとって、accept()結果が得られるまで戻らない関数のように見えるためです。その間、プロセスは他に何もできません。

いったんaccept戻って、Apacheのは、誰かが接続を開始しようとしていることを知っています。次にforkを呼び出して、Apacheプロセスを2つの同一のプロセスに分割します。これらのプロセスの1つはHTTP要求の処理に進み、他のプロセスacceptは次の接続を取得するために再度呼び出します。したがって、常にacceptサブプロセスを呼び出して生成するだけのマスタープロセスがあり、各要求に対して1つのサブプロセスがあります。

これは単純化です。プロセスの代わりにスレッドを使用してこれを行うことができます。またfork、要求を受信するとすぐにワーカープロセスを準備できるようにして、起動のオーバーヘッドを削減することもできます。Apacheの構成方法に応じて、これらのいずれかを実行できます。

これは、その方法の最初の広範なカテゴリであり、ソケットを操作するシステムや呼び出しは、何かを返すまでプロセスを一時停止するため、ブロッキングIOと呼ばれます。acceptreadwrite

他の大まかな方法​​は、ノンブロッキングまたはイベントベースまたは非同期IOと呼ばれます。これは、のようなシステムコールを用いて実装されますselectepoll。これらはそれぞれ同じことを行います:ソケット(または一般的にはファイル記述子)のリストとそれらの処理を指定し、カーネルはそれらのいずれかを実行する準備ができるまでブロックします。

このモデルではepoll、「ポート80に新しい接続があるか、開いているこれらの9471他の接続のいずれかを読み取る新しいデータがある場合、教えてください」とカーネルに伝えることができます。epollそれらのいずれかの準備が整うまでブロックし、それを実行します。その後、繰り返します。acceptandのようなシステムコール、readおよびwriteブロックepollすることはありません。その理由の1つは、コールするたびに、準備ができているのでブロックする理由がないことを通知したためです。非ブロッキングモードでは、これらの呼び出しはEWOULDBLOCKブロッキングの代わりに失敗します。

このモデルの利点は、必要なプロセスが1つだけであることです。これは、リクエストごとにスタックとカーネル構造を割り当てる必要がないことを意味します。NginxHAProxyはこのモデルを使用します。これは、同様のハードウェアでApacheよりも多くの接続を処理できる大きな理由です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.