全局变量如何在内存中以不同于局部变量的方式存储

时间:2013-10-06 23:41:55

标签: operating-system stack memory-address

我正在阅读一本关于操作系统的书,它说“我们必须进行设置,以便将分配给全局变量的增加空间的部分分配给程序的生命周期,但是为本地分配的部分仅当线程在变量范围“

中时,变量仍保持分配状态

我不明白的是,当程序加载到内存中时,不是为它保留的静态地址吗?当变量超出范围时,操作系统看到变量所在的地址空间(是?)at现在可以被其他程序使用,或者不是吗?

书中说全局变量存储在内存中,局部变量存储在运行时堆栈中。首先,运行时堆栈在内存中,所以我没有看到区别。操作系统如何知道为运行时堆栈分配多少空间,因为在运行之前无法确定要推送的项目数?

2 个答案:

答案 0 :(得分:0)

当本书说“全局变量存储在内存中”时,它所指的是堆,它与堆栈不同。两者都是记忆但不同类型的记忆。

请点击此处了解详情:http://www-ee.eng.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.8.html

答案 1 :(得分:0)

忽视现代操作系统所需的虚拟内存和内存管理解决方案。

可执行文件中嵌入的是包含全局变量的固定/静态数据所需的内存量。数据段(DS)(硬件)寄存器跟踪这些固定数据元素。 DS金额不会改变。 DS指向连续的内存块。如果没有足够的连续内存,则会出现内存不足错误,并且程序无法加载。正如你所说,在程序执行期间,这个内存不会“超出范围”。

局部变量是从堆栈段(SS)寄存器管理的内存的另一部分分配的。在程序执行期间,SS管理的内存量会增加和缩小。最大和最小尺寸由操作系统(OS)确定。 (这些大小不是基于当今复杂操作系统中的物理内存大小)

如果在执行期间超过最大数量,则会出现堆栈溢出错误。

如果最小尺寸不可用,则程序不会执行。所以pgm至少从最小量开始。如果在执行期间需要更多SS存储器,OS将增加存储器块 - 如果可能的话,还会发生堆栈溢出错误。

当调用一个函数时,它的局部变量是从SS中分配的(类似于在DS中分配全局变量的方式)。 SS中还有其他内务处理项目,例如函数退出时的去向(即调用该函数后代码的地址)。当函数以嵌套方式调用其他函数时,堆栈会增长和增长。当每个函数完成执行时,控制返回到调用函数,已完成函数的局部变量被释放,堆栈缩小。

“堆”内存是另一个内存块,它根据需要增长,以便在程序执行期间保存“已创建”或“已分配内存空间”的项目(使用“malloc”或“new”或某些动词,具体取决于语言)。与SS一样,操作系统确定最小和最大尺寸,每个pgm至少以最小量开始。

今天的现代cpus,操作系统,语言内置了多层保护,以确保物理内存的内容得到妥善处理,即不能执行数据块,也不能写/读代码块。

虚拟内存,移动内存块以允许多个程序运行(内存管理)以及摆脱超出范围的堆项的需要增加了另一层,但上面详述的基本知识仍然适用。