第六章运行时的存储空间 的运行时存储空间的结构和分配 过程活动记录AR 运行时变量的访问
第六章 运行时的存储空间 运行时存储空间的结构和分配 过程活动记录AR 运行时变量的访问
运行时的存储空间结构 ●要保存的信息: 目标代码;数据;库函数代码;数据信息表; 控制信息等 e运行时的存储空间结构: 最大地址 堆区空间 栈区空间 最小地址 库代码空间 静态区空间 目标代码空间
运行时的存储空间结构 要保存的信息: 目标代码;数据;库函数代码;数据信息表; 控制信息等 运行时的存储空间结构: 目标代码空间 静态区空间 库代码空间 堆区空间 栈区空间 最大地址 最小地址
运行时静态区的分配 存储对象的存储位置在程序的整个生命 周期是固定的。 分配对象 全程变量常量信息表 ●分配方法: 块地址法:( DataArea,0 ffset) 变址模式:( Register,0 ffset)
运行时静态区的分配 存储对象的存储位置在程序的整个生命 周期是固定的。 分配对象: 全程变量 常量 信息表 分配方法: 块地址法:(DataArea,Offset) 变址模式:(Register,Offset)
栈区的存储分配 ●存在递归调用 存储对象: 过程中被声明的形参、局部变量临时变量 e分配方法: 对每个被调用过程分配一段存储空间,sp存放当前 过程空间的开始地址;对变量X:( Leve l,off) 则其存放地址为off[sp] 过程结束时自动释放空间; ●不能存储: 值的生命周期长于过程的变量 动态申请空间的变量;
栈区的存储分配 存在递归调用 存储对象: 过程中被声明的形参、局部变量 临时变量 分配方法: 对每个被调用过程分配一段存储空间,sp存放当前 过程空间的开始地址;对变量X:(Level,off), 则其存放地址为off[sp]。 过程结束时自动释放空间; 不能存储: 值的生命周期长于过程的变量; 动态申请空间的变量;
堆区的存储分配 e可随时分配和释放空间 ●存储对象: 动态申请空间的变量的值 e释放空间方法: 显示释放: 隐式释放:单指针释放 计数释放法 标记释放法 分配空间方法: 最佳符合法;首次优先法;循环首次优先法
堆区的存储分配 可随时分配和释放空间 存储对象: 动态申请空间的变量的值 释放空间方法: 显示释放: 隐式释放:单指针释放 计数释放法 标记释放法 分配空间方法: 最佳符合法;首次优先法;循环首次优先法
运行时的过程活动记录与 栈区的组织结构 e过程活动记录(AR:过程的一个现场记录 记录内容: 今过程控制信息:先行活动记录的动态链指针、 返回地址、层数和长度等 令机器状态信息:寄存器状态等 ◆全局变量信息:非局部变量的信息 ◆局部变量值:形参变量、局部变量和临时变量
运行时的过程活动记录与 栈区的组织结构 过程活动记录(AR):过程的一个现场记录 记录内容: ❖过程控制信息:先行活动记录的动态链指针、 返回地址、层数和长度等 ❖机器状态信息:寄存器状态等 ❖全局变量信息: 非局部变量的信息 ❖局部变量值:形参变量、局部变量和临时变量
AR的结构 临时变量区 局部变量区 本层变量和返回值 形参变量区 返回值 全局变量环境 全局变量信息 机器状态 机器状态信息 过程层数 返回地址 控制状态信息 动态链指针 sp
AR的结构: 动态链指针 返回地址 过程层数 机器状态 全局变量环境 返回值 形参变量区 局部变量区 临时变量区 控制状态信息 机器状态信息 全局变量信息 本层变量和返回值 sp
例 Procedure p(i: integer) Var y: real; a: array[1. 10]of integer Begin y: =a[i]*25 end 则过程p被调用时的活动记录AR结构如下: Offset 23 a Offset =13 y Offset =11 Offset 10 返回值 全局信息 机器信息 sp 控制信息 Offset =0
例: Procedure p(i:integer); Var y:real; a:array[1..10]of integer; Begin y:=a[i]*25 end 则过程p被调用时的活动记录AR结构如下: 控制信息 机器信息 全局信息 返回值 i y a Offset = 10 Offset = 11 Offset = 13 Offset = 23 sp Offset = 0
动态链 ●调用链:过程名序列 若M是主程序名,则(M)是一个调用链; 若(M,…,R)是调用链,且在R中有S的 调用,则(M,…,R,S)也是调用链。 记为: Cal chain(S)=(M,…,R,S) e动态链: 如果有调用链 Cal chain(S)=(M,R,S), 则它对应的动态链为: Dynamic Chain=LAR(M),., AR(R), AR(S)
动态链 调用链 :过程名序列 若M是主程序名,则(M)是一个调用链; 若( M, …, R )是调用链,且在R中有S的 调用,则( M, …, R, S)也是调用链。 记为:CallChain(S)= (M, …,R, S) 动态链: 如果有调用链CallChain(S)=(M,…,R, S), 则它对应的动态链为: DynamicChain=[AR(M),…,AR(R),AR(S)]
e调用过程Q时: 今新产生活动记录 NewAR 今填写 NewAR的内容: 动态链指针:=sp; 填写返回地址、层数、大小和机器状态 8 sp: =sp+CurrentAR. size: 令转向Q子程序。 退出过程Q时 ◆(R1,R R):= CurrentAR, Machine Value: =CurrentAR Returnvalue 8 sp: =CurrentAR DynPointer ◆按原 CurrentAR. return返回
调用过程Q时: ❖ 新产生活动记录NewAR ❖ 填写NewAR的内容: 动态链指针:=sp; 填写返回地址、层数、大小和机器状态 ❖ sp:=sp+CurrentAR.Size; ❖ 转向Q子程序。 退出过程Q时: ❖ (R1 ,R2 ,...,Rn ) := CurrentAR.Machine; ❖ Value:=CurrentAR.ReturnValue; ❖ sp:=CurrentAR.DynPointer;. ❖ 按原CurrentAR.return返回;