私はC/C++でのネットワーキングを研究しているのでソケットです。たとえば、私は現在Firefoxを使用しており、10KBページと30MBページの両方をロードできます。したがって、Webサーバーから取得したすべてのデータが何らかのバッファーに書き込まれていると思いますが、そのバッファーは固定サイズですか、それともコンテンツサイズに基づいていますか?
2 に答える
データは実際にはバッファからバッファへと流れ、最終的にはメモリに蓄積されます。サーバーはディスクからディスクバッファを介して読み取り、TCPネットワークバッファに書き込みます。TCPネットワークバッファは、カーネルがネットワークインターフェイスバッファに空にします。データは、さまざまなネットワークリンクを通過するときに、ネットワーク上をバッファからバッファへと移動します。最終的に、それはあなたのオペレーティングシステムのTCP接続バッファに行き着き、あなたのブラウザはメインメモリのバッファに空になり続けます。これらのバッファはすべてさまざまなサイズであり、一部は固定、一部は可変です。
サーバーまたはブラウザーでは、1つの実装は、「平均ページサイズ」(ビンの配列)で始まる[power-of-2]の増加するバッファーサイズの*buffersを含むプールキューの配列/ベクトルです。起動時に、妥当な数のバッファーを使用してビンをロードします。ネットワークrxがバッファをいっぱいにした場合は、次のビンから1つを取得し、それを最初のビンにリンクして、それを埋め始めます。最初のバッファーのコンテンツサイズが非常に優れている場合は、適切なサイズのバッファー(またはレンダリングを高速化してユーザーエクスペリエンスを向上させるためのバッファーのベクトル)を選択できます。賢い場合は、2番目のバッファが完全にいっぱいになる前に、最初のバッファのレンダリングを開始できます。
ロードに応じて、ビンの内容を動的に調整して、現在の需要に合わせることができます。明らかに、すべてのビン、キューなどはスレッドセーフになります(私は生産者/消費者キューのブロックを使用します)。