我正在研究 C/C++ 所以套接字的网络。例如,我现在使用的是 firefox,我可以同时加载 10KB 页面和 30MB 页面。所以我假设我从 Web 服务器获得的所有数据都写入了某个缓冲区。但是该缓冲区是固定大小还是基于 Content-size?
问问题
226 次
2 回答
3
数据实际上是从一个缓冲区流到另一个缓冲区,最终在内存中结束。服务器通过磁盘缓冲区从磁盘读取并写入 TCP 网络缓冲区,其内核将其清空到网络接口缓冲区中。当数据通过各种网络链接时,数据在网络上从一个缓冲区传输到另一个缓冲区。最终,它会在您的操作系统的 TCP 连接缓冲区中结束,您的浏览器会不断地将其清空到主内存中的缓冲区中。这些缓冲区都是各种不同的大小,有些是固定的,有些是可变的。
于 2012-09-25T17:36:52.990 回答
0
在服务器或浏览器中,一种实现是池队列的数组/向量,其中包含 [power-of-2] 增加缓冲区大小的 *buffers,从“平均页面大小”开始 - 一个 bin 数组。在启动时使用一些合理数量的缓冲区加载垃圾箱。如果网络 rx 填充了一个缓冲区,则从下一个 bin 中获取一个,将其链接到第一个并开始填充,依此类推。如果第一个缓冲区具有内容大小,那就更好了 - 您可以选择适当大小的缓冲区(或缓冲区向量以加速渲染以改善用户体验)。如果你很聪明,你可以在第二个缓冲区完全填满之前开始渲染第一个缓冲区,依此类推。
根据负载,您可以动态调整 bin 内容以适应当前需求。显然,所有的箱子、队列等都是线程安全的(我使用阻塞的生产者-消费者队列)。
于 2012-09-25T18:27:45.600 回答