“舞台”这个词在记忆方面的含义是什么?

我正在阅读内存中的文本作为编程概念。 在后面的章节之一,作者大量使用“竞技场”这个词,但从来没有定义它。 我search了这个词的技术意义,但什么都没发现。 以下是作者使用“竞技场”这个术语的一些背景:

“序列化的下一个例子结合了一个叫做内存分配的策略。”

“…在处理内存泄漏或从特定舞台进行分配时,这非常有用。”

“…如果我们想要释放记忆,那么我们将释放整个舞台。”

作者在这一章中使用了超过100次的术语。 术语表中唯一相关的定义是:

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

我发现的唯一相关问题是内存领域2中的exception安全性,没有任何帮助。 任何人都可以根据这些背景为我定义“竞技场”吗?

一个竞技场只是一个大的,连续的内存,你分配一次,然后用它来手动pipe理内存的部分内存。 例如:

char * arena = malloc(HUGE_NUMBER); unsigned int current = 0; void * my_malloc(size_t n) { current += n; return arena + current - n; } 

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

一个stream行的用例是每个竞技场只用于分配一个固定大小的内存块。 在这种情况下,您可以编写非常高效的回收algorithm。 另一个用例是每个“任务”都有一个竞技场,当你完成任务时,你可以一次性释放整个舞台,不必担心跟踪个别释放。

每种技术都是非常专业化的,一般只有当你确切地知道你在做什么以及为什么正常的库分配不够好的时候才派上用场。 请注意,一个好的内存分配器本身已经有很多魔法了,而且你需要大量的证据来certificate,在你自己处理内存之前,这还不够好。

我会用这个作为可能的答案。

•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()重复的小的调用可能是昂贵的(每个内存分配都有一个性能成本:在程序的逻辑地址空间中分配内存所花费的时间以及将地址空间分配给物理记忆),就像你知道一个球场一样,你可以得到大量的记忆,然后把它交给你的variables。

把它看作是“堆”的同义词。 通常,你的进程只有一个堆/竞技场,所有的内存分配从那里发生。

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

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

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

libc.so.x共享库包含glibc组件,而且堆代码驻留在其中。 堆的当前实现使用称为arenas的多个独立的子堆。 每个竞技场都有自己的并发保护互斥体。 因此,如果在一个进程堆中有足够的场所,并且在这些堆之间均匀分布线程堆的机制,那么争用互斥体的可能性应该是最小的。 事实certificate,这适用于分配。 在malloc()中,进行testing以查看当前线程的当前目标竞技场的互斥锁是否可用(trylock)。 如果是这样,竞技场现在被locking,分配进行。 如果互斥量繁忙,则每个剩余​​的竞技场都会依次尝试并在互斥量不繁忙时使用。 如果没有阻挡的竞技场没有locking,就会创造一个新的竞技场。 根据定义,这个舞台还没有被locking,所以现在可以进行分配而不会阻塞。 最后,一个线程最后使用的竞技场的ID保留在线程本地存储器中,随后在该线程下一次调用malloc()时作为第一个竞技场。 因此,所有对malloc()的调用都将继续进行而不会阻塞。

你也可以参考这个链接:

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