内存池和缓冲区

Memory pools and buffers C++

本文关键字:缓冲区 内存      更新时间:2023-10-16

我有一些关于缓冲区和内存池的问题,我想回答。

假设我有一个服务器,发送和接收~50-100+ msg/秒。所有的消息都有不同的大小。如何才能充分利用这里的内存管理呢?我最初的计划是使用固定大小的缓冲节点,并将它们池化,例如:

struct buffer{
    uint8_t  data[512];
    uint32_t end;
    buffer*  next;
}
buffer* b = pool_get_new_buffer();

因此,当发送msg时,我根据大小创建一个或多个缓冲区并将它们链接在一起。这样我就不用担心自己在池子里碎裂了。(至少我是这么认为的)。但是在小msg上,这是浪费空间。

但是在互联网上阅读和检查越来越多的代码,似乎没有人使用这种方法。那么什么是更好的方法呢?根据msg大小从池中分配内存?

编辑:因此,我接下来可能会对不同的方法进行更深入的比较。

如果我使用链式缓冲区方法,我猜我会将碎片保持在最低水平,但另一方面,我猜为链中的每个缓冲区做内存也是有代价的。但是,分配足够大的缓冲区并执行单个内存也一定有其缺点,尽管大多数人无论如何都会选择这种方法。

如果有一个单独的缓冲区,比如0.5/1MB大小。这显然取决于目标操作系统/设备,可能还取决于您的最大消息大小。另外,让您的服务器包含数据包大小。假设您的数据包没有超过单个缓冲区大小,您可以将数据下载到缓冲区中,处理它,然后将内存标记为可用。我已经将这种方法用于单个客户机-服务器应用程序。