“竞技场”一词与记忆有什么关系?

我正在读一本关于内存作为编程概念的书。在后面的章节中,作者大量使用了 竞技场这个词,但从来没有定义它。我一直在寻找这个词的意思以及它与记忆的联系,但是一无所获。下面是作者使用这个词的一些语境:

”下一个序列化示例包含一个名为 内存分配从一个特定的 竞技场。”

”... 这在处理内存泄漏或分配 从一个特定的 竞技场

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

作者在一章中使用这个词超过100次,词汇表中唯一的定义是:

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

考虑到这些上下文,有人能为我定义 竞技场吗?

42977 次浏览

我就用这个来作为一个可能的答案。

•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.

我将添加 维基百科的同义词: 区域、区域、竞技场、区域或内存上下文。

基本上就是你从操作系统获得的内存,然后分配出去,就可以一次释放所有内存。这样做的好处是,对 malloc()的重复小调用可能代价高昂(每次内存分配都有性能成本: 分配程序逻辑地址空间中的内存所需的时间,以及将该地址空间分配给物理内存所需的时间)。

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

char * arena = malloc(HUGE_NUMBER);


unsigned int current = 0;


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

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

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

这些技术都非常专业,通常只有在您确切知道自己在做什么以及为什么普通的库分配不够好的情况下才能派上用场。请注意,一个好的内存分配器本身已经做了很多神奇的事情,在您开始自己处理内存之前,您需要大量的证据来证明这些证据是不够好的。

把它想象成“堆”的同义词。通常,您的进程只有一个堆/场,所有内存分配都是从那里发生的。

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

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

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

X 共享库包含 glibc 组件和堆 代码驻留在其中。堆的当前实现使用 多个独立的子堆称为竞技场。每个竞技场都有自己的 互斥对并发保护。因此,如果有足够的竞技场 在进程的堆中,以及分发线程的机制 堆在它们之间均匀地访问,那么潜在的争用 互斥对象应该是最小的 在 malloc ()中,将进行一个测试,以查看用于 当前线程的当前目标竞技场是空闲的(trylock) 那么竞技场现在是锁定的,分配继续进行。如果互斥 然后每个剩余的竞技场轮流尝试和使用,如果 互斥对象不忙。在没有竞技场可以锁定的情况下 一个新的竞技场被创造出来。这个竞技场的定义是 没有被锁定,所以分配现在可以在没有 最后,线程最后使用的竞技场 ID 是 保留在线程本地存储中,随后用作第一个 当 malloc ()接下来被该线程调用时,可以尝试使用 所有对 malloc ()的调用将在不阻塞的情况下继续进行。

你亦可参考以下连结:

Http://www.codeproject.com/articles/44850/arena-allocator-dtor-and-embedded-preallocated-buf

分享我在这个问题上学到的东西(答案基于 glibc malloc)。

arenaheap是用于内存管理的两种不同的数据结构。他们在不同的层次上工作: arena在更高的层次上。

竞技场 在包含 references to one or more heaps的一个或多个线程之间共享的结构。默认情况下,每个进程至少有一个竞技场,即由主线程创建的 main arena。而对于多线程程序,将有多个竞技场(称为线程竞技场)。但是线索和竞技场之间没有一对一的映射关系。由于竞技场的数目有下列上限:

For 32 bit systems:
Number of arena = 2 * number of cores.
For 64 bit systems:
Number of arena = 8 * number of cores.

线程竞技场可以包含多个堆,但主竞技场没有多个堆。

一个连续的内存区域,被细分为要分配的块。

enter image description here