U6 运行时存储组织及管理
2023-12-13 11:10:08
一、概述
1、概念
目标程序运行时所需存储空间的组织与管理以及源程序中变量存储空间的分配。
2、任务
- 数据结构在内存里是如何表示的?
- 函数在内存中是如何表示的?
需求1:需要记住调用前的状态,以便在调用结束后返回
需求3:满足 Scope 的要求,能够找到所有的数据结构
需求2:需要提供一种办法,在调用函数和被调函数之间传递参数,返回值 - 他们在内存中如何放置,如何管理?
3、分配方式
1)静态存储分配
在编译阶段由编译程序实现对存储空间的管理和为源程序中的变量分配存储的方法。
如果在编译时能够确定源程序中变量在运行时的数据空间大小,且运行时不改变,那么就可以采用静态存储分配方法。
具体操作可见U4
2)动态存储分配
在目标程序运行阶段由目标程序实现对存储空间的组织与管理,和为源程序中的变量分配存储的方法。
在目标程序运行时进行变量的存储分配。
编译时要生成进行动态分配的目标指令。
二、静态存储分配
1、策略
由于每个变量所需空间的大小在编译时已知,因此可以用简单的方法给变量分配目标地址。
- 开辟一数据区。(首地址在加载时定)
- 按编译顺序给每个模块分配存储空间。
- 在模块内部按顺序给模块的变量分配存储,一般用相对地址,所占数据区的大小由变量类型决定。
- 目标地址填入变量的符号表中
2、数据区
FORTRAN子程序的典型数据区
三、动态存储分配
编译时不能具体确定程序所需数据空间,编译程序生成有关存储分配的目标代码,实际上的分配要在目标程序运行时进行。
1、策略
整个数据区为一个堆栈
(1) 当进入一个过程时,在栈顶为其分配一个数据区。
(2) 退出时,撤消过程数据区。
2、活动记录
一个典型的活动记录可以分为三部分:
- 局部数据区:存放模块中定义的各个局部变量。
- 参数区: 存放隐式参数和显式参数
prev abp :存放调用模块记录基地址,函数执行完时,释放其数据区,数据区指针指向调用前的位置。
ret addr:返回地址,即调用语句的下一条执行指令地址。
这个不能立即的出来,需要子程序算完之后找到源程序返回值地址赋值上去
ret value : 函数返回值(无值则空)。
形参数据区: 每一形参都要分配数据空间,形参单元中存放实参值或者实参地址
display区:存放各外层模块AR的基地址
display区存储形式:变量二元地址(BL、ON)
BL:变量声明所在的层次。(可得到该层数据区开始地址)
ON:相对于显式参数区的开始位置的位移。(相对地址)
地址计算:
eg.高层(内层)模块可以引用低层(外层)模块中的变量,例如在M1中可引用外层模块中定义的变量Y。
在M1的display区中可找到程序块1的活动记录基地址, 加上Y在数据区的相对地址就可以求得Y的绝对地址。
3)案例分析
转换层次:
按顺序生长栈
F的模板:
四、C语言的处理
C语言不采用 Display 区记录
五、垃圾回收
栈和堆的分配区别:
垃圾回收是一种自动内存管理机制,可以对动态分配的内存空间进行自动回收。
垃圾回收是运行时的一部分,但可以从编译器中收集信息。
常用方法:引用计数,标记和清除,拷贝回收,混合策略
文章来源:https://blog.csdn.net/ning_xiao_xuan/article/details/134831691
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!