目标程序运行时的存储组织
2017-10-14 18:08
211 查看
在代码生成前,编译程序必须进行目标程序运行环境的设计和数据空间的分配。一般来讲,假如编译程序从操作系统中得到一块存储区以使目标程序在其上运行,该存储区需容纳生成的目标代码和目标代码运行时的数据空间。数据空间应包括:用户定义的的各种类型的数据对象(变量和常数)所需的存储空间,作为保留中间结果和传递参数的临时工作单元,调用过程时所需的连接单元,以及组织输入输出所需的缓冲区。目标代码所占的大小,在编译时能确定,有些数据对象所占用的空间也能在编译时确定,其地址可以编译进目标代码中。但有些数据对象具有可变体积和待编译性质,而无法在编译时确定存储空间和位置。
因此运行时的存储区常常划分成:目标区、静态数据区、栈区和堆区。代码区用以存放目标代码,这是固定长度的,即编译时能确定的。静态数据区用以存放编译时能确定所占用空间的数据,堆栈区用于可变数据以及管理过程活动的控制信息。
数据空间的使用和管理方法分成三种:静态存储分配、栈式动态存储分配和堆式动态存储分配。
如果编译时能确定确定目标程序运行中所需全部数据空间的大小,编译时安排好目标程序运行时的全部数据空间,确定每个数据对象的存储位置,这种分配为静态存储分配。
栈式动态存储分配是将整个程序的数据空间设计为一个栈,每当调用一个过程,它所需的数据空间就分配在栈顶,没当过程工作结束时就释放着部分空间。过程所需的数据空间包括两部分:一部分是生存期在本过程这次活动中的数据对象,如局部变量,参数单元,临时变量等;另一部分是用以管理过程活动的记录信息,即当一次过程调用出现时,调用该过程的过程的活动即被中断,当前机器的状态信息,诸如程序计数器(返回地址)、寄存器的值等,也都必须保留在栈中。
如果一个程序语言提供用户自由地申请数据空间和退还数据空间的机制(如 new),或者不仅有过程而且有进程的程序结构,即空间的使用未必服从“先申请后释放,后申请先释放”的原则,那么栈式分配方案就不适应了。这种情况下通常使用一种称为堆式的动态存储分配方案。假设程序运行时有一个大的存储空间,每当需要时就从这片空间中借用一块,不用时再退还,由于借还的时间先后不一,经一段运行之后,程序运行空间将被分成许多块,有些占用,有些空闲。有的分配管理系统采用废品回收的方法来解决空闲空间的问题。
因此运行时的存储区常常划分成:目标区、静态数据区、栈区和堆区。代码区用以存放目标代码,这是固定长度的,即编译时能确定的。静态数据区用以存放编译时能确定所占用空间的数据,堆栈区用于可变数据以及管理过程活动的控制信息。
数据空间的使用和管理方法分成三种:静态存储分配、栈式动态存储分配和堆式动态存储分配。
如果编译时能确定确定目标程序运行中所需全部数据空间的大小,编译时安排好目标程序运行时的全部数据空间,确定每个数据对象的存储位置,这种分配为静态存储分配。
栈式动态存储分配是将整个程序的数据空间设计为一个栈,每当调用一个过程,它所需的数据空间就分配在栈顶,没当过程工作结束时就释放着部分空间。过程所需的数据空间包括两部分:一部分是生存期在本过程这次活动中的数据对象,如局部变量,参数单元,临时变量等;另一部分是用以管理过程活动的记录信息,即当一次过程调用出现时,调用该过程的过程的活动即被中断,当前机器的状态信息,诸如程序计数器(返回地址)、寄存器的值等,也都必须保留在栈中。
如果一个程序语言提供用户自由地申请数据空间和退还数据空间的机制(如 new),或者不仅有过程而且有进程的程序结构,即空间的使用未必服从“先申请后释放,后申请先释放”的原则,那么栈式分配方案就不适应了。这种情况下通常使用一种称为堆式的动态存储分配方案。假设程序运行时有一个大的存储空间,每当需要时就从这片空间中借用一块,不用时再退还,由于借还的时间先后不一,经一段运行之后,程序运行空间将被分成许多块,有些占用,有些空闲。有的分配管理系统采用废品回收的方法来解决空闲空间的问题。
相关文章推荐
- 程序运行之目标文件(一)
- 完成文件复制操作,在程序运行后提示输入源文件路径,然后再输入目标文件路径。
- C中变量存储区、程序编译后的映像和运行时的段分析
- 编译原理(六)运行时存储空间的组织和行为2
- 题目-本地存储-程序运行次数
- 完成文件复制操作,在程序运行后提示输入源文件路径,然后再输入目标文件路径。
- WebAssembly,可以作为任何编程语言的编译目标,使应用程序可以运行在浏览器或其它代理中——浏览器里运行其他语言的程序?
- 完成文件复制操作,在程序运行后提示输入源文件路径,然后再输入目标文件路径。
- C#.NET通用权限管理在DB2数据库上运行的脚本参考 - 通过程序将数据导入到目标数据库中
- [转]C#程序无法在64位系统上运行之.NET编译的目标平台
- C语言运行程序的存储区域
- 完成文件复制操作,在程序运行后提示输入源文件路径,然后再输入目标文件路径。
- Qt程序在运行的目标机上Gif等格式的图片无法显示问题
- 完成文件复制操作,在程序运行后提示输入源文件路径,然后再输入目标文件路径。
- 玩具侠-C语言学习之程序运行及内存存储(1)
- 实验 3.1.5 查看代码中各数据存储位置 示例程序: mem_add.c 1. 在自己的机器上运行示例程序。 2. 分析实验结果,图示程序运行时各数据位置。
- java程序运行时会存储到什么地方
- java程序运行时数据存储
- 数组的应用以及建立临时容器存储程序运行产生的数据-作者:逝秋
- chrome扩展程序开发之在目标页面运行自己的JS