【问题标题】:how are global variables stored differently in memory than local variables全局变量在内存中的存储方式与局部变量的存储方式有何不同
【发布时间】:2013-10-13 11:02:42
【问题描述】:

我正在阅读一本关于操作系统的书,上面写着“我们必须进行设置,以便分配给全局变量的那部分空间在程序的生命周期内分配紧张,但那部分分配给本地只有当线程在变量范围内时,变量才会保持分配状态"

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

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

【问题讨论】:

    标签: operating-system stack memory-address


    【解决方案1】:

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

    更多详情请看这里:http://www-ee.eng.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.8.html

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

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

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

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

      【讨论】:

      • 总之,局部变量在栈上,全局变量在堆上,还是不一定?
      猜你喜欢
      • 2010-10-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 2017-05-03
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多