术语竞技场与记忆有什么关系?

时间:2012-10-10 17:38:04

标签: c++ c memory-management

我正在读一本关于记忆的书作为编程概念。在后面的章节中,作者大量使用竞技场这个词,但从未对其进行定义。我已经搜索了这个词的含义以及它与记忆的关系,并没有发现任何东西。以下是作者使用术语的几种情境:

  

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

     

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

     

“......如果我们要释放内存,那么我们将解除分配   整个竞技场。“

作者在一章中使用了100多次这个词。词汇表中唯一的定义是:

  

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

根据这些情况,任何人都可以为我定义竞技场吗?

4 个答案:

答案 0 :(得分:91)

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

char * arena = malloc(HUGE_NUMBER);

unsigned int current = 0;

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

关键是你可以完全控制内存分配的工作方式。您无法控制的唯一事情就是单个库调用初始分配。

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

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

答案 1 :(得分:9)

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()的重复小调用可能成本很高(每个内存分配都有性能成本:在程序的逻辑地址空间中分配内存所花费的时间以及分配该地址所需的时间空间到物理记忆)就好像你知道一个球场你可以给自己留下一大块记忆然后把它交给你的变量你需要它。

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:5)

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

  

libc.so.x共享库包含glibc组件和堆   代码驻留在其中。堆的当前实现使用   多个独立的子堆称为竞技场。每个竞技场都有自己的竞技场   用于并发保护的互斥锁。因此,如果有足够的场地   在进程'堆中,以及分配线程的机制'   堆在它们之间均匀访问,然后是争用的可能性   因为互斥量应该是最小的。事实证明这很有效   用于分配。在malloc()中,进行测试以查看互斥锁是否为   当前线程的当前目标竞技场是免费的(trylock)。如果是这样   然后竞技场现在被锁定,分配继续进行。如果是互斥量   忙着然后每个剩余的竞技场轮流尝试并使用,如果   互斥不忙。如果没有竞技场可以锁定   封锁,创造了一个全新的竞技场。根据定义,这个竞技场是   尚未锁定,因此现在可以不进行分配   阻塞。最后,线程最后使用的竞技场的ID是   保留在线程本地存储中,随后用作第一个   当该线程接下来调用malloc()时尝试的竞技场。因此   对malloc()的所有调用都将在不阻塞的情况下继续。

您也可以参考以下链接:

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