与记忆相关的“竞技场”一词的含义是啥?

Posted

技术标签:

【中文标题】与记忆相关的“竞技场”一词的含义是啥?【英文标题】:What is the meaning of the term arena in relation to memory?与记忆相关的“竞技场”一词的含义是什么? 【发布时间】:2012-10-01 06:24:23 【问题描述】:

我正在阅读一本关于内存作为编程概念的书。在后面的一章中,作者大量使用了arena这个词,但从未定义它。我搜索了这个词的含义以及它与记忆的关系,但一无所获。以下是作者使用该术语的一些上下文:

"下一个序列化示例包含一个策略,称为 来自特定竞技场的内存分配。”

"...这在处理内存泄漏或分配时很有用 来自特定的竞技场。”

"...如果我们想释放内存,那么我们将释放 整个竞技场。”

作者在一章中使用该术语超过 100 次。词汇表中的唯一定义是:

从竞技场分配 - 先分配竞技场然后再分配的技术 通过程序管理竞技场内的分配/解除分配 本身(而不是由进程内存管理器);用于 复杂数据结构和对象的压缩和序列化, 或用于管理安全关键和/或容错的内存 系统。

鉴于这些情况,谁能为我定义竞技场

【问题讨论】:

这本书叫什么名字? @yaobin Memory as a Programming Concept in C and C++ by Frantisek Franek。 【参考方案1】:

竞技场只是一块大的、连续的内存,您分配一次,然后通过分发部分内存来手动管理内存。例如:

char * arena = malloc(HUGE_NUMBER);

unsigned int current = 0;

void * my_malloc(size_t n)  current += n; return arena + current - n; 

关键是您可以完全控制内存分配的工作方式。唯一不受您控制的是初始分配的单个库调用。

一个流行的用例是每个 arena 仅用于分配一个固定大小的内存块。在这种情况下,您可以编写非常有效的回收算法。另一个用例是每个“任务”有一个竞技场,当您完成任务后,您可以一次性释放整个竞技场,而无需担心跟踪单个释放。

这些技术中的每一种都非常专业,通常只有在您确切知道自己在做什么以及为什么正常的库分配不够好时才会派上用场。请注意,一个好的内存分配器本身已经可以发挥很多作用,在您开始自己处理内存之前,您需要大量证据证明这还不够好。

【讨论】:

这是一个很好的答案,但请考虑删除或修改最后一段。你真的不需要任何证据。只要您知道如何使用内存,您就知道的不仅仅是一个“好的”通用分配器,如果您使用这些知识,您的自定义分配器将永远胜出。分配器不是魔术。如果您有很多物品都在同一个明确定义的时间点死亡,那么竞技场很有用。这几乎就是您需要知道的所有内容。这不是火箭科学。 @AndreasHaferburg:标准库中的内存分配器自动比自定义编写自己的内存分配器具有巨大优势,即您不必编写/测试/调试/维护等。即使您'确定没有证据表明您可以通过管理自己的分配来提高性能,您仍然需要充分的证据才能确定这种改进值得权衡。 @ruakh 我只是不喜欢这种随处重复一百万次作为“智慧”的货物崇拜心态。 “C++之神给了我们,所以我们必须使用它。”我最喜欢的是:“这很神奇。”不,这不是魔术。它只是一种非常简单的算法,即使是计算机也可以运行它。在我的书中,这远非魔法。我的猜测:您低估了内存分配对性能的影响,而高估了竞技场的复杂程度。性能是否比开发人员时间更重要是一个商业决策,在 SO 上讨论有点毫无意义。 @AndreasHaferburg:当然,tcmalloc 使用了一些特定的算法,其背后的想法很容易解释,但实现仍然很复杂且不平凡。最重要的是,它需要特定于平台的知识才能获得正确的内存排序。我将“魔法”用于根本无法由用户编写的东西(如高效的互斥锁、tcmalloc 或 lambda 的类型名称),或仅用于极端英雄(如 std::function);我的意思不是“无法理解”。 @AndreasHaferburg:我的最终建议并不是说原则上“比默认设置更好”,而是说维护自定义解决方案的成本很高(有人必须编写、记录、正确处理,其他人必须修复错误,每个人都必须随着使用的扩展审查和重新验证原始假设),并且您需要证据来证明该成本是合理的。【参考方案2】:

I'll go with this one 作为可能的答案。

•Memory Arena (also known as break space)--the area where dynamic runtime memory is stored. The memory arena consists of the heap and unused memory. The heap is where all user-allocated memory is located. The heap grows up from a lower memory address to a higher memory address.

我将添加Wikipedia's synonyms:区域、区域、竞技场、区域或内存上下文。

基本上它是您从操作系统获得的内存,然后分配出去,然后可以一次全部释放。这样做的好处是对malloc() 的重复小调用可能代价高昂(每次内存分配都有性能成本:在程序的逻辑地址空间中分配内存所花费的时间以及将该地址空间分配给物理内存),就像您知道一个球场一样,您可以为自己获取一大块内存,然后根据需要/如何将其分配给您的变量。

【讨论】:

【参考方案3】:

将其视为“堆”的同义词。通常,您的进程只有一个堆/竞技场,所有内存分配都从那里发生。

但是,有时您会遇到将一系列分配组合在一起的情况(例如,为了提高性能、避免碎片等)。在这种情况下,最好分配一个新的堆/竞技场,然后对于任何分配,您可以决定从哪个堆分配。

例如,您可能有一个粒子系统,其中经常分配和释放大量相同大小的对象。为避免内存碎片化,您可以从仅用于这些粒子的堆中分配每个粒子,而所有其他分配将来自默认堆。

【讨论】:

【参考方案4】:

来自http://www.bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html

libc.so.x 共享库包含 glibc 组件和堆 代码位于其中。堆的当前实现使用 多个独立的子堆称为 arenas。每个竞技场都有自己的 用于并发保护的互斥锁。因此,如果有足够的竞技场 在进程“堆中,以及分配线程的机制” 堆在它们之间均匀访问,那么就有可能发生争用 因为互斥锁应该是最小的。事实证明这很好用 用于分配。在 malloc() 中,进行测试以查看互斥体是否为 当前线程的当前目标 arena 是空闲的(trylock)。如果是这样的话 然后竞技场现在被锁定并且分配继续进行。如果互斥锁 忙,然后依次尝试每个剩余的竞技场并使用,如果 互斥锁不忙。如果没有任何竞技场可以被锁定 阻挡,创造了一个全新的竞技场。这个竞技场的定义是 尚未锁定,因此分配现在可以继续进行 阻塞。最后,线程最后使用的竞技场的 ID 是 保留在线程本地存储中,随后用作第一个 arena 在该线程下一次调用 malloc() 时尝试。所以 所有对 malloc() 的调用都将继续进行而不会阻塞。

你也可以参考这个链接:

http://www.codeproject.com/Articles/44850/Arena-Allocator-DTOR-and-Embedded-Preallocated-Buf

【讨论】:

仅供参考,在发布链接时,您应该发布摘要,以便在链接的文章消失时您的帖子仍然有用。 这似乎是来自bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html 的复制粘贴,请在逐字使用时注明来源。

以上是关于与记忆相关的“竞技场”一词的含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章

CommonServiceLocator 的评论中环境一词的含义是啥?

大学软件工程 里 对象 这一词的名词解释是啥?

在HTML中,三种定位的区别和含义分别是啥?

在计算机科学环境中,“语义”一词是啥意思?

语言是Lua,单词是“嵌入式”

逻辑基础知识逻辑的含义