程序堆栈和堆,它们是如何工作的?
我知道每个正在运行的进程在虚拟内存中都有与其关联的页面,并且根据需要很少会将其加载到主内存中。 我也知道程序将有一个堆栈,并且还有一个堆来分配动态内存。 这是我的问题。
你能推荐任何涵盖这些东西的好书吗?
是的 - 堆栈通常存储在内存的“低”地址并向上填充到上限。 堆通常存储在地址空间的“顶部”并朝向堆栈增长。
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?