- 堆栈是否也是主内存中某个页面的一部分?
- 当程序移动到等待状态时会发生什么?堆栈指针、程序计数器和其他信息存储在哪里?
- 为什么堆栈向下增长而堆向上增长?
- L1、L2缓存可以只包含一个连续内存块,还可以包含堆栈和堆的某些部分吗?
栈是否也是主内存中某个页面的一部分?
是的 - 栈通常存储在内存的“低”地址处,并向上填充到其上限。堆通常存储在地址空间的“顶部”,并向栈增长。
当程序进入等待状态时会发生什么?栈指针、程序计数器和其他信息存储在哪里?
操作系统为每个正在运行的进程存储一个“上下文”。保存和恢复进程状态的操作称为“上下文切换”。
为什么栈向下增长而堆向上增长?
据我所知,这只是一种约定。栈实际上没有“增长”,它有固定的分配。
L1、L2缓存是否可以只包含一个连续的内存块,还是可以包含一部分栈和堆?
缓存只包含已使用的 RAM 部分的快照(最近使用或附近)。在任何时刻,它们都可以在其中具有地址空间的任何部分的内存。显示在哪里取决于缓存的结构参数(块长度、关联性、总大小等)。
我建议参考计算机体系结构:量化研究方法以了解底层硬件,以及任何操作系统书籍以了解硬件的“管理”。
栈是否也是存储在主内存中某个页面中的一部分?
是的,栈通常也存储在进程地址空间中。
当程序被移动到等待状态时会发生什么情况?栈指针、程序计数器和其他信息存储在哪里?
当操作系统将进程从活动状态转换为等待状态时,它会将所有寄存器(包括栈指针和程序计数器)存储在内核的进程表中。然后,当它再次变为活动状态时,操作系统会将所有信息复制回原位。
为什么栈向下增长而堆向上增长?
因为它们通常必须共享同一地址空间,并且作为一种方便,它们各自从地址空间的一端开始。然后它们朝着彼此增长,形成了向下增长和向上增长的行为。
L1、L2缓存是否可以只包含一个连续的内存块,或者可以包含一部分栈和堆?
CPU缓存将存储最近使用的内存块。由于栈和堆都存储在主内存中,缓存可以包含两者的部分。
3. 为什么栈向下增长而堆向上增长?
请注意,在某些系统(例如一些惠普系统)中,栈是向上增长而不是向下增长。在其他系统(例如IBM/390)中,实际上根本没有硬件栈,而是从用户空间内动态分配的页面池。
堆可以在任何方向上增长,因为它可能包含许多分配和释放的空洞,所以最好将其视为松散的页面集合,而不是LIFO堆栈类型结构。尽管如此,大多数堆实现都会在预定的地址范围内扩展其空间使用,并根据需要进行增长和缩小。
你应该查看我架构课程中教授的幻灯片,链接为https://www.cis.upenn.edu/~cis501/。第六单元真的帮助我理解了你和其他人所问和回答的所有内容以及更多内容,如果你想要更深入的知识。