【问题标题】:memory allocation in the power of two vs multiple of eight以 2 的幂与 8 的倍数的内存分配
【发布时间】:2021-06-23 06:29:01
【问题描述】:

实现一个总是以 (2) 的幂分配内存的内存分配器会更好吗?有没有其他有效的方法说 (8) 分配的倍数?分配逻辑是否会出现碎片问题,例如 (8) 的倍数分配?

【问题讨论】:

  • 什么是二的幂次分配?您的意思是分配器仅分配大小(以字节为单位)1、2、4、8、16、32、64、128、256、512、1024 等的块,而不分配诸如 768 等大小的块?因为您的替代方案是 8 的倍数,这将允许 8、16、24、32、40、48 等等,包括 768。我不希望仅分配 2 的幂大小总体上是好的。
  • @EricPostpischil 我认为 OP 的意思是 2,4,6,8,10 ... 或 8,16,24,32 ....
  • IMO 它不会有任何区别。请记住,您也需要注意对齐方式
  • @EricPostpischil 是的,分配大小为 2、4、8、16、32、64、128 与 8、16、24、32、40、48 的块之间的比较。我已经编码了 2 的幂,评估如果我用 8 的倍数替换它是否会出现碎片问题。
  • @Ram:无论哪种方式都可能存在碎片问题,具体取决于分配代码的设计及其客户端的行为。有些程序会以导致更多碎片的方式分配和释放内存,而有些程序会以导致更少碎片的方式分配和释放内存。

标签: c unix memory-management operating-system malloc


【解决方案1】:

有一个叫buddy memory allocator的东西,它是Linux内核中的一个东西,但它用于分配物理页框,而不是虚拟内存。

Jemalloc 似乎为虚拟内存实现了伙伴内存分配器。


使用 操作系统malloc 以 2 的幂次方分配内存没有任何好处 - 事实上,在使用 Glibc malloc 时它会浪费内存 - 这是因为128 KiB 的分配实际上会使用mmap 分配一页,并使用额外的内存页来存储几个指针。如果你需要一块内存并且担心浪费空间,你不会使用malloc,而是直接使用操作系统mmap

【讨论】:

  • 我认为 Glibc malloc 使用带有固定大小 bin 的伙伴系统进行小分配,但使用混合大小 bin 进行较大分配,mmap 用于更大分配。对于固定大小的 bin,可用块大小是 2 的幂减去每个块的开销。
  • @IanAbbott 不是真的:stackoverflow.com/questions/57996975/…
  • 是的,你的权利。连续的固定大小的小块大小增加 8 或 16 个字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
相关资源
最近更新 更多