什么是真正的内存结构?

时间:2018-01-12 21:52:33

标签: memory

我对与记忆有关的事情有一个愚蠢的怀疑。我的疑问是:为什么在内存中,更高的地址被考虑在"底部",最低的地址被考虑在" top"?我将更详细地解释:

堆栈内存以高地址开始,并逐渐增加到较低地址。到目前为止,这是我所理解的,但为什么堆栈会增长" up"?为什么较低的地址位于内存的顶部?

我已经看到了各种相互矛盾的内存结构:考虑到内存底部的较低地址,以及考虑内存顶部较低地址的内存结构。它取决于处理器吗?

提前谢谢。

1 个答案:

答案 0 :(得分:-1)

取决于instruction set architectureABI。它们都会影响call stack的组织(和增长方向)。

通常调用堆栈会向下扩展,但是有一些情况并非如此(请参阅this)。有些ISA(例如IBM serie Z大型机)没有任何硬件调用堆栈(那么,调用堆栈只是关于寄存器使用的ABI约定)。

大多数application software(例如您的游戏,文字处理程序,编译器......)的运行速度高于某些operating system,某些process运行时virtual address space(所以virtual memory)。

阅读一些关于操作系统的书,例如Operating Systems: Three Easy Pieces

在实践中(除非您编写一些操作系统内核管理虚拟内存),您主要关心虚拟地址空间(通常由许多不连续的段组成)。在Linux上,使用LOAD DATA INFILE 'file.csv' INTO TABLE estimate (State, Population) SET Year = 2010; (请参阅proc(5))进行探索(例如,在终端中尝试/proc/)。请注意,对于多线程应用程序,每个thread都有自己的调用堆栈。那么虚拟地址空间的“顶部”或“底部”并不重要,也没有多大意义。

如果(像大多数人一样)你正在编写(使用汇编程序以外的任何编程语言)某些操作系统以上的某些应用程序软件,你不关心(作为开发人员)真正的内存,但关于virtual memoryresident set size。您不关心堆栈增长(它由操作系统,编译器,ISA,...代码的automatic variables管理)。您需要避免stack overflow。经常发生一些pages(例如你的code segment [s]),或许那些包含从未使用过代码的内容,从未进入RAM并保持paged。实际上,某些进程的大多数(虚拟)内存对于其调用堆栈来说:您通常在堆中分配内存。我的firefox浏览器(在我的Linux桌面上)的虚拟地址空间为2.3千兆字节(超过一千个段),但只有124千字节的堆栈。阅读memory management。调用堆栈通常是有限的(例如,几兆字节)。