我有一些关于缓冲区和内存池的问题,我想回答一下。
假设我有一台服务器,发送和接收~50-100 + msg /秒。所有消息都有各种尺寸。你会如何在这里充分利用内存管理?我最初的计划是使用固定大小的缓冲节点,并将它们集中在一起,例如:
struct buffer{
uint8_t data[512];
uint32_t end;
buffer* next;
}
buffer* b = pool_get_new_buffer();
因此,当发送msg时,我会根据大小创建一个或多个缓冲区并将它们链接在一起。这样我就不会害怕它自己的池中的碎片。 (或者至少我认为)。但在小消息上,它浪费了空间。
但是阅读越来越多,并在互联网上查看代码,看起来根本没有人使用这种方法。那么什么是更好的方法呢?根据msg大小从池中分配内存?
修改: 那么在这之后我可能会对不同方法进行更深入的比较。
如果我使用链式缓冲区方法,我猜测我会将碎片保持在最低点,但另一方面,我猜想对链中的每个缓冲区执行memcpy也需要付出代价。但话说回来,分配足够大的缓冲区并执行单个memcpy也必须有其缺点,即使大多数人仍然选择这种方法。
答案 0 :(得分:1)
如何使用单个缓冲区,比如说大小为0.5 / 1MB。这显然取决于目标OS /设备以及可能的最大消息大小。此外,让您的服务器包含数据包大小。假设您的数据包没有超过单个缓冲区大小,您可以将数据下载到缓冲区,处理它,然后将内存标记为可用。我已将此方法用于单个客户端 - 服务器应用程序。