2013-10-06 58 views
0

我正在阅读一本关于操作系统的书,它说:“我们必须进行设置,以便将分配给全局变量的部分分配给终生时间的程序,但分配给局部变量的那部分仍然只在线程处于变量范围时才分配“全局变量如何在局部变量中以不同方式存储在内存中

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

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

回答

0

无视时刻,通过现代的操作系统所需的虚拟内存和存储管理解决方案。

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

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

如果在执行过程中超过最大值,将会出现堆栈溢出错误。

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

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

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

当今的现代CPU,OS,语言中内置了多层保护,以确保物理内存的内容得到正确处理,即不能执行数据块,也不能写入/读取代码块。虚拟内存,需要移动内存块以允许多个程序运行(内存管理)并摆脱超出范围的堆项目添加另一层,但上面详细介绍的基本原理仍然适用。

+0

所以简而言之,局部变量放在堆栈上,全局变量放在堆上,或不一定? – Celeritas

相关问题