8

我有几个关于缓冲区和内存池的问题想要回答。

假设我有一台服务器,发送和接收 ~50-100+ msg / 秒。所有的味精都有不同的大小。您将如何进行以充分利用这里的内存管理?我最初的计划是使用固定大小的缓冲区节点,并将它们汇集起来,例如:

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

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

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

编辑:所以我在这里之后可能是对不同方法的更深入的比较。

如果我使用链式缓冲区方法,我猜我会将碎片保持在最低水平,但另一方面,我猜想对链中的每个缓冲区执行 memcpy 也是有代价的。但是话又说回来,分配足够大的缓冲区并执行单个 memcpy 也必然有其缺点,尽管大多数人还是选择了这种方法。

4

1 回答 1

1

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

于 2013-03-31T01:07:59.190 回答