Web 服务器缓冲区

Web servers buffer

本文关键字:缓冲区 服务器 Web      更新时间:2023-10-16

我正在研究C/C++套接字的网络。例如,我现在使用Firefox,我可以加载10KB页面和30MB页面。所以我假设我从Web服务器获得的所有数据都写入了某个缓冲区。但该缓冲区是固定大小还是基于内容大小?

数据实际上是从一个缓冲区流向另一个缓冲区,最终在内存中结束。服务器通过磁盘缓冲区从磁盘读取,并写入 TCP 网络缓冲区,其内核将其清空到网络接口缓冲区中。数据在通过各种网络链路时通过网络从一个缓冲区传输到另一个缓冲区。最终,它会在操作系统的TCP连接缓冲区中结束,您的浏览器会不断将其清空到主内存中的缓冲区中。这些缓冲区都有各种不同的大小,有些是固定的,有些是可变的。

在服务器或浏览器中,一种实现是池队列的数组/向量,其中包含 [[power-of-2] 的缓冲区,增加缓冲区大小,从"平均页面大小"开始 - 一个箱数组。 在启动时加载一些合理数量的缓冲区的箱。 如果网络 rx 填充了一个缓冲区,请从下一个 bin 向上获取一个缓冲区,将其链接到第一个缓冲区并开始填充该缓冲区,依此类推。 如果第一个缓冲区具有内容大小,那就更好了 - 您可以选择适当大小的缓冲区(或缓冲区矢量以加快渲染速度以改善用户体验)。 如果你很聪明,你可以在第二个缓冲区完全填满之前开始渲染第一个缓冲区,依此类推。

根据装载情况,您可以动态调整箱内容以适应当前需求。 显然,所有的箱、队列等都是线程安全的(我使用阻塞生产者-消费者队列)。