我有几个关于缓冲区和内存池的问题想要回答。
假设我有一台服务器,发送和接收 ~50-100+ msg / 秒。所有的味精都有不同的大小。您将如何进行以充分利用这里的内存管理?我最初的计划是使用固定大小的缓冲区节点,并将它们汇集起来,例如:
struct buffer{
uint8_t data[512];
uint32_t end;
buffer* next;
}
buffer* b = pool_get_new_buffer();
因此,当发送 msg 时,我会根据大小创建一个或多个缓冲区并将它们链接在一起。这样我就不用担心它自己在池中的碎片化。(或者至少我是这么想的)。但是在小味精上,它浪费了空间。
但是在互联网上阅读越来越多并查看代码,似乎根本没有人使用这种方法。那么什么是更好的方法呢?根据 msg 大小从池中分配内存?
编辑:所以我在这里之后可能是对不同方法的更深入的比较。
如果我使用链式缓冲区方法,我猜我会将碎片保持在最低水平,但另一方面,我猜想对链中的每个缓冲区执行 memcpy 也是有代价的。但是话又说回来,分配足够大的缓冲区并执行单个 memcpy 也必然有其缺点,尽管大多数人还是选择了这种方法。