【问题标题】:Any memory usage paradigm besides Stack and Heap?除了堆栈和堆之外的任何内存使用范例?
【发布时间】:2010-02-23 19:14:18
【问题描述】:

当我学过数据结构时,我知道除了堆栈和堆之外还有很多其他的数据结构,为什么现在的进程只在其地址空间中包含这两种范式作为“标准设备”?是否有任何全新的内存使用范式?

感谢您的回复。是的,我意识到我的陈述有问题。堆数据结构与进程地址空间中的堆不同。但是我想知道的是,除了进程地址空间中的堆栈区和堆区之外,还有什么新的使用内存的范式吗?似乎其他的内存使用方式是建立在这两个 basic 范式之上的。而这两种范式是某种元范式?

【问题讨论】:

  • 后进先出、先进先出结构算数吗?我是唯一一个发现这个问题不准确的人吗?

标签: c++ architecture operating-system


【解决方案1】:

让我们想一想。我们有两个基本的存储规则。连续且分散。

连续的。

  • 堆栈受顺序限制。后进先出。函数调用的嵌套上下文需要 this。

  • 我们可以轻松地反转这个模式来定义一个队列。先进先出。

  • 我们可以在队列中添加一个绑定来创建一个循环队列。输入输出处理需要这个。

  • 我们可以将这两个约束组合成一个Dequeue

  • 我们可以向队列添加一个键和排序来创建一个优先队列。操作系统调度程序要求这样做。

    所以。这是一系列受进入顺序限制的连续结构的变化。这些有多种实现方式。

  • 您可以拥有不受输入顺序限制的连续存储:ArrayHash。数组由“位置”索引,哈希由Key的哈希函数索引。

碎片化:

  • 裸“堆”是没有关系的碎片存储。这是通常的方法。

  • 您可以使用句柄进行堆存储以允许重定位。旧的 Mac OS 曾经这样做。

您可以使用关系(列表和树等)进行分段存储。

  • 链接列表。单链表和双链表是实现选择。

  • 二叉树有 0、1 或 2 个孩子。

  • 高阶树。 尝试等。

我们在做什么?一打?

您也可以将其视为与存储无关的“集合”。在这种情况下,您可以混合存储规则(堆式或数组式)

Bags:允许重复的无序集合。您可以拥有一个基于多种存储规则的包:LinkedBag、TreeBag、ArrayBag、HashBag。链接和树使用分片存储,数组和哈希使用连续存储。

集合:无重复的无序集合。没有索引。再次:LinkedSet、TreeSet、ArraySet、HashSet。

列表:有序集合。按位置索引。再次:LinkedList、TreeList、ArrayList、HashList。

映射:键值关联集合。键索引。 LinkedMap、TreeMap、ArrayMap、HashMap。

【讨论】:

  • 非常感谢。 S.洛特。你的回答对我来说是宝藏。只是需要进一步澄清:当您说“使用句柄进行堆存储以允许重定位”时,您的意思是让系统维护一个包含(句柄值,内存地址)等条目的表,以便系统可以重定位对象内存而不影响客户端的视图,但是以另一个级别的间接为代价,“句柄”似乎是某种“不透明指针”?
  • @smwikipedia:这就是 Mac OS(Mac OS X 之前)的工作方式。句柄是指向真实结构的不透明指针,因此操作系统可以重新定位堆元素。实际上,它为您提供了高性能的虚拟内存。
【解决方案2】:

请注意,“堆”(您可以按随机顺序分配和释放内存的内存区域)与称为“堆”(优先级列表)的数据结构无关。

顺便说一句,是的,除了堆栈和堆之外,还有第三种内存使用范式:静态存储;-)

【讨论】:

    【解决方案3】:

    我想到了先进先出。处理器之间的共享内存。消息传递会是一种内存范式吗?

    【讨论】:

    • 谢谢,肯尼。恕我直言,消息传递方法需要在进程地址空间的堆区域中分配某种“邮件槽”缓冲区。但我想知道为什么应该有一个堆区域?为什么不做其他安排?
    • 作为一名前硬件专家,我的想法更多的是物理记忆。消息传递架构不必是基于堆的。不过,在当今的大多数实施中,您是对的。
    【解决方案4】:

    Javolution (http://javolution.org/) 有一些有趣的分配范例,通过代码和解释器使用上下文“提示”实现。池化内存、对象回收支持等。虽然这是 Java 而不是 C++,但它仍然可以用于研究这些概念。

    【讨论】:

    【解决方案5】:

    内存映射文件?

    【讨论】:

    • 内存映射文件是文件子系统、i/o子系统和内存管理子系统之间的某种交互。映射文件仍在进程地址空间的堆区域中。我的问题是为什么有一个堆区域?为什么不是其他范式?
    • 如果您声称未作为堆栈管理的所有内容都是堆的一部分,那么您已经创建了重言式。在至少一些实现中,调用 OS 中的不同代码路径来映射文件而不是分配堆。你还想要什么?
    • 是的,dmckee。也许我对堆的范围太广了。
    【解决方案6】:

    “堆”根本不是一个范式,它是你能得到的最基本的东西:内存是你的,你想怎么用就怎么用。 (这里的“你”指的是操作系统/内核)。

    如果你仔细想想,即使堆栈也不是那么特别;你只是从堆的一端开始并根据需要增长/缩小。

    【讨论】:

    • 谢谢,hasenj,您的回答正是我想说的,将堆和堆栈描述为“元范式”。我刚才不确定这个词的选择,但似乎你和我有相似的想法。很高兴。 :D
    【解决方案7】:

    我认为这与记忆的物理性质有关。堆和栈只是表示它的直观方式。

    例如,队列或列表在概念上不适合随机访问。树并不代表内存的物理性质(一个接一个的单元,就像一个数组)。与简单的整数地址相比,具有 x,y 地址的任何类型的元组都不必要地复杂。

    【讨论】:

    • 谢谢,杰森。你的回答让我精神一振。
    【解决方案8】:

    【讨论】:

    • DMA缓冲区分配在Heap区。为什么要有堆区?
    猜你喜欢
    • 2018-09-27
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2011-10-21
    • 2011-06-13
    • 2019-05-18
    • 2011-01-23
    • 2015-09-11
    相关资源
    最近更新 更多