您的位置:首页 > 其它

目标程序运行时的存储组织

2017-10-14 18:08 211 查看
  在代码生成前,编译程序必须进行目标程序运行环境的设计和数据空间的分配。一般来讲,假如编译程序从操作系统中得到一块存储区以使目标程序在其上运行,该存储区需容纳生成的目标代码和目标代码运行时的数据空间。数据空间应包括:用户定义的的各种类型的数据对象(变量和常数)所需的存储空间,作为保留中间结果和传递参数的临时工作单元,调用过程时所需的连接单元,以及组织输入输出所需的缓冲区。目标代码所占的大小,在编译时能确定,有些数据对象所占用的空间也能在编译时确定,其地址可以编译进目标代码中。但有些数据对象具有可变体积和待编译性质,而无法在编译时确定存储空间和位置。

  因此运行时的存储区常常划分成:目标区静态数据区栈区堆区。代码区用以存放目标代码,这是固定长度的,即编译时能确定的。静态数据区用以存放编译时能确定所占用空间的数据,堆栈区用于可变数据以及管理过程活动的控制信息。

  

  数据空间的使用和管理方法分成三种:静态存储分配栈式动态存储分配堆式动态存储分配

  如果编译时能确定确定目标程序运行中所需全部数据空间的大小,编译时安排好目标程序运行时的全部数据空间,确定每个数据对象的存储位置,这种分配为静态存储分配。

  栈式动态存储分配是将整个程序的数据空间设计为一个栈,每当调用一个过程,它所需的数据空间就分配在栈顶,没当过程工作结束时就释放着部分空间。过程所需的数据空间包括两部分:一部分是生存期在本过程这次活动中的数据对象,如局部变量,参数单元,临时变量等;另一部分是用以管理过程活动的记录信息,即当一次过程调用出现时,调用该过程的过程的活动即被中断,当前机器的状态信息,诸如程序计数器(返回地址)、寄存器的值等,也都必须保留在栈中。

  如果一个程序语言提供用户自由地申请数据空间和退还数据空间的机制(如 new),或者不仅有过程而且有进程的程序结构,即空间的使用未必服从“先申请后释放,后申请先释放”的原则,那么栈式分配方案就不适应了。这种情况下通常使用一种称为堆式的动态存储分配方案。假设程序运行时有一个大的存储空间,每当需要时就从这片空间中借用一块,不用时再退还,由于借还的时间先后不一,经一段运行之后,程序运行空间将被分成许多块,有些占用,有些空闲。有的分配管理系统采用废品回收的方法来解决空闲空间的问题。

  

  

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐