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