程序堆栈和堆,它们是如何工作的?

我知道每个正在运行的进程在虚拟内存中都有与其关联的页面,并且根据需要很少会将其加载到主内存中。 我也知道程序将有一个堆栈,并且还有一个堆来分配动态内存。 这是我的问题。

  • 堆栈也是主内存中某个页面的一部分吗?
  • 程序移至等待状态时会发生什么? 堆栈指针,程序计数器和其他信息存储在哪里?
  • 为什么堆栈增长和堆积增长?
  • L1,L2缓存是否只包含一个连续内存块,还是可以包含堆栈和堆的某些部分?
  • 你能推荐任何涵盖这些东西的好书吗?


  • 是的 - 堆栈通常存储在内存的“低”地址并向上填充到上限。 堆通常存储在地址空间的“顶部”并朝向堆栈增长。

  • O / S存储每个正在运行的进程的“上下文”。 保存和恢复进程状态的操作称为“上下文切换”。

  • 只是一个传统的AFAIK。 这个堆栈并不真正“增长”它有固定的分配。

  • 缓存只包含已使用的RAM部分的快照(最近或最近)。 在任何时候,他们都可以从他们地址空间的任何部分获得内存。 什么显示在哪里很大程度上取决于缓存的结构参数(块长度,关联性,总大小等)。

  • 我建议计算机体系结构:定量方法作为底层硬件和任何有关硬件如何“管理”的操作系统的书籍的良好参考。


    这是我对这些问题的理解:

  • 堆栈也是主内存中某个页面的一部分吗?

    是的,堆栈通常也存储在进程地址空间中。

  • 当程序移动到等待状态时,会发生什么情况?堆栈指针,程序计数器和其他信息存储在哪里?

    当操作系统将进程从活动状态变为等待状态时,它将所有寄存器(包括堆栈指针和程序计数器)存储在内核的进程表中。 然后,当它再次变为活动状态时,操作系统会将所有信息复制回原处。

  • 为什么堆栈增长和堆积增长?

    这是因为它们通常必须共享相同的地址空间,并且为了方便起见,它们分别从地址空间的一端开始。 然后他们彼此成长,让他们成长 - 长大成长。

  • L1,L2缓存是否只包含一块连续内存,或者它是否可以包含堆栈和堆的某些部分?

    CPU高速缓存将存储最近使用的内存块。 因为堆栈和堆都存储在主内存中,所以缓存可以包含两者的一部分。


  • 3.为什么堆栈增长减少,堆积增长?

    请注意,在某些系统(例如某些HP系统)中,堆栈增长而不是减少。 在其他系统上(例如IBM / 390),根本没有真正的硬件堆栈,而是从用户空间内存中动态分配的一组页面。

    总的来说,堆可以向任何方向发展,因为它可能包含许多分配和释放漏洞,所以最好将它看作是一个松散的页面集合,而不是LIFO堆栈类型的结构。 这就是说,大多数堆实现扩展了它们在预定地址范围内的空间使用量,并在必要时扩大和缩小它。

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

    上一篇: Program stack and heap, how do they work?

    下一篇: Does OpenMP move stack or data variables to the heap if they are shared?