1

我正在读一本关于操作系统的书,它说“我们必须进行设置,以便分配给全局变量的部分空间紧张分配给程序的生命周期,但分配给局部变量的部分仍然分配仅当线程在变量范围内时”

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

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

4

2 回答 2

0

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

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

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

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

如果最小尺寸不可用,则程序不会执行。所以 pgm 至少从最小数量开始。如果在执行过程中需要更多的 SS 内存,操作系统将增大内存块 - 如果可能,则堆栈溢出错误。

当一个函数被调用时,它的局部变量是从 SS 分配的(有点像全局变量在 DS 中的分配方式)。SS 中还有其他的管理项,例如函数退出时的去向(即调用函数之后的代码的地址)。随着函数以嵌套方式调用其他函数,堆栈不断增长。随着每个函数完成执行,控制权返回到调用函数,完成函数的局部变量被释放,堆栈收缩。

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

当今的现代 CPU、操作系统、语言中内置了保护层,以确保正确处理物理内存的内容,即不能执行数据块,也不能写入/读取代码块。

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

于 2013-10-07T00:48:01.297 回答
0

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

有关详细信息,请参见此处:http ://www-ee.eng.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.8.html

于 2013-10-06T23:47:57.737 回答