内存池和缓冲区
Memory pools and buffers C++
我有一些关于缓冲区和内存池的问题,我想回答。
假设我有一个服务器,发送和接收~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大小。这显然取决于目标操作系统/设备,可能还取决于您的最大消息大小。另外,让您的服务器包含数据包大小。假设您的数据包没有超过单个缓冲区大小,您可以将数据下载到缓冲区中,处理它,然后将内存标记为可用。我已经将这种方法用于单个客户机-服务器应用程序。
相关文章:
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 如何使用带有矢量的 winapi 读取进程内存从另一个进程读取缓冲区?
- 在共享缓冲区内存中创建 ::std::string 对象
- OpenGL 调试上下文警告 -"将使用视频内存作为缓冲区异议的来源
- 如何从内存缓冲区加载张量流图
- 将 mmap 内存用于开销非常低的循环缓冲区
- 不正确的 Vulkan 统一缓冲区内存对齐
- 无锁环形缓冲区boost示例中的内存排序
- 为异步发送缓冲区保留内存(提升 asio 套接字)
- 来自iostream或内存缓冲区的Apache Arrow表
- 如何重复使用原始输入缓冲区内存?
- 如何释放协议缓冲区内存
- 如何正确复制内存缓冲区?
- 将不相邻的内存缓冲区视为连续缓冲区的数据结构
- 我可以在没有任何锁的情况下从不同的线程读取内存缓冲区吗?
- C++ - 读取进程内存到缓冲区,写入进程内存(同一缓冲区上的新值)将缓冲区恢复为旧值
- Vulkan中动态统一缓冲区的缓冲区内存分配
- 正确释放协议缓冲区内存
- 清除stdin缓冲区(内存占用空间)
- 线程写入缓冲区内存和线程内存