物理内存堆和堆栈在哪里?

我通过一些关于堆和堆栈的搜索阅读,但大多数答案只是说明了它的概念描述和差异。

我很好奇其他的事情。

  • 正如标题所说,堆和物理内存堆栈在哪里?

  • 它们的大小如何? 例如,我在台式电脑上使用12千兆字节的内存,那么堆是多少? 以及堆栈大小是多少?

  • 谁制造了这两种不同类型的概念?

  • 我可以操纵堆和堆栈的分配吗? 如果它们每个都占用50%的内存(如果Heap占用6千兆字节内存,Stack在我的情况下占用6千兆字节),我可以调整它们的大小吗?


  • 正如标题所说,堆和物理内存堆栈在哪里?
  • 自从CPU有MMU在虚拟内存和物理内存之间添加一个间接层之后,堆和堆栈就一直存在于物理内存中。 自从现代操作系统实施ASLR以来,堆栈和堆栈也一直存在于虚拟内存中。

  • 它们的大小如何? 例如,我在台式电脑上使用12千兆字节的内存,那么堆是多少? 以及堆栈大小是多少?
  • 两者都从小规模开始并按需求增长。 在Unix上,最大堆栈大小由ulimit -s设置,堆大小由ulimit -d限制。 你可以看到你的Unix操作系统默认在ulimit -a上设置了什么限制。

  • 谁制造了这两种不同类型的概念?
  • 我敢打赌至少可以追溯到20世纪60年代。 维基百科有一个从1960年的参考。

  • 我可以操纵堆和堆栈的分配吗? 如果它们每个都占用50%的内存(如果Heap占用6千兆字节内存,Stack在我的情况下占用6千兆字节),我可以调整它们的大小吗?
  • 正如已经说过的那样,他们调整自己的尺寸,或者更准确地说,它们是根据需求增长的,并且在操作系统和用户设定的限度内。 如果您使用的是Unix和bash,请参阅ulimit帮助。


    1.它可以是无处不在。 即使在物理记忆之外,因为在应用方面没有这样的事情。 用户所有内容都使用虚拟内存,可以将其映射到HDD上的RAM或交换区域。 这里没有特定的假设,对不起。

    2.它们都是动态增长的,区别在于速度和大小限制:

  • 通常被认为是较慢的。 它根据应用要求进行分配。 它和RAM的数量甚至更大(分页)一样巨大。

  • 堆栈速度更快,因为它通过简单移动堆栈指针“分配” 。 它通常有大小限制。 例如,在C ++中,这限制设置在编译的相位( ulimit -s上GCC, /STACK:reserve/STACK:reserve,commit于MSVC)。

  • 堆栈通常要小得多,并且可以很容易溢出(这就是我们所说的堆栈溢出 )。 例如,在C ++中,您很可能无法执行此操作:

    int main()
    {
        int large_array[1000000];
        return 0;
    }
    

    因为:

    在这里输入图像描述

    虽然这非常好:

    int main()
    {
        int* large_array = new int[1000000]; //allocated from heap
        return 0;
    }
    

    3.一些非常聪明的人。

    4.仔细阅读第1-3点,你就会知道答案。

    链接地址: http://www.djcxy.com/p/78697.html

    上一篇: Where is Heap and Stack on Physical Memory?

    下一篇: OpenMP: poor performance of heap arrays (stack arrays work fine)