230 likes | 369 Views
第六章 运行时的存储空间. 运行时存储空间的结构和分配 过程活动记录 AR 运行时变量的访问. 运行时的存储空间结构. 要保存的信息: 目标代码;数据;库函数代码;数据信息表; 控制信息等 运行时的存储空间结构:. 最大地址. 堆区空间 栈区空间. 最小地址. 库代码空间. 静态区空间. 目标代码空间. 运行时静态区的分配. 存储对象的存储位置在程序的整个生命 周期是固定的。 分配对象: 全程变量 常量 信息表 分配方法: 块地址法:( DataArea,Offset)
E N D
第六章 运行时的存储空间 • 运行时存储空间的结构和分配 • 过程活动记录AR • 运行时变量的访问
运行时的存储空间结构 • 要保存的信息: 目标代码;数据;库函数代码;数据信息表; 控制信息等 • 运行时的存储空间结构: 最大地址 堆区空间 栈区空间 最小地址 库代码空间 静态区空间 目标代码空间
运行时静态区的分配 • 存储对象的存储位置在程序的整个生命 周期是固定的。 • 分配对象: 全程变量 常量 信息表 • 分配方法: 块地址法:(DataArea,Offset) 变址模式:(Register,Offset)
栈区的存储分配 • 存在递归调用 • 存储对象: 过程中被声明的形参、局部变量 临时变量 • 分配方法: 对每个被调用过程分配一段存储空间,sp存放当前 过程空间的开始地址;对变量X:(Level,off), 则其存放地址为off[sp]。 过程结束时自动释放空间; • 不能存储: 值的生命周期长于过程的变量; 动态申请空间的变量;
堆区的存储分配 • 可随时分配和释放空间 • 存储对象: 动态申请空间的变量的值 • 释放空间方法: 显示释放: 隐式释放:单指针释放 计数释放法 标记释放法 • 分配空间方法: 最佳符合法;首次优先法;循环首次优先法
运行时的过程活动记录与栈区的组织结构 • 过程活动记录(AR):过程的一个现场记录 • 记录内容: 过程控制信息:先行活动记录的动态链指针、 返回地址、层数和长度等 机器状态信息:寄存器状态等 全局变量信息: 非局部变量的信息 局部变量值:形参变量、局部变量和临时变量
临时变量区 局部变量区 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 i Offset = 10 返回值 全局信息 机器信息 控制信息 Offset = 0 sp
动态链 • 调用链 :过程名序列 若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)]
调用过程Q时: 新产生活动记录NewAR 填写NewAR的内容: 动态链指针:=sp; 填写返回地址、层数、大小和机器状态 sp:=sp+CurrentAR.Size; 转向Q子程序。 • 退出过程Q时: (R1,R2,...,Rn) := CurrentAR.Machine; Value:=CurrentAR.ReturnValue; sp:=CurrentAR.DynPointer;. 按原CurrentAR.return返回;
活跃活动记录(LAR) • LiveAR(LAR): 一个过程S在动态链中可有多个AR,但其中只有最新AR(S)是可访问的,称此AR(S)为S的活跃活动记录,并记为LiveAR(S),简写为LAR(S)。 • 例:假设有当前调用链是(M,P1,P2,Q1, R1,R2,R3 ) 则当前动态AR链为: [AR(M),AR(P1),AR(P2),AR(Q),AR(R1),AR(R2),AR(R3)] 活跃活动记录LAR为: LAR( M ) = AR(M) LAR( P ) = AR(P2) LAR( Q ) = AR(Q1) LAR( R ) = AR(R3)
运行时的变量访问 • 过程声明链(DeclaChain):过程名序列 (M)是过程声明链,M是主程序名; 若(M,…,P)是过程声明链,且P中有过程Q 的声明,则(M,…,P,Q)也是过程声明链; 记为:DeclaChain(Q)=( M,…,P,Q ) • 当前变量访问环境VarVisitEnv: 若DeclaChain(Q)= [M,…,P,Q]则 VarVisitEnv(LAR(Q))= [LAR(M),…,LAR(P),LAR(Q)]
若(M,…,P,Q)CallChain(Q),且Q的层数为N, 则有 DeclaChain(Q)= DeclaChain(P)N Q • 设[AR(M),…,AR(Pi),AR(Qj)]DynamicChain(Q),且Q 的层数为N,则有: VarVisitEnv(AR(Qj))=VarVisitEnv(AR(Pi))N AR(Qj) PROC P; …… PROC Q Begin End …… Begin Q End PROC Q; …… PROC P; Begin Q End Begin End PROC P; Begin Q End …… PROC Q; Begin …end PROC P; …… Begin Q End
变量访问环境的实现方法 • Display表方法 全局表法 局部表法 • 静态链方法 • 寄存器方法
局部Display表方法 • 对于每个AR求出其变量访问环境,并把它以 地址表的形式(Display表)保存在AR中。因 为每个AR都自带Display表,称这种方法为局 部化Display表方法。 • 如果层数为N的过程P的变量访问环境为: VarVisitEnv(AR(P))=[ARi1,…,ARi,n+1], arij表示ARij的始地址,则 [ari1,…,ari,n+1]是AR(P)的Display表.
…… [ar0,ar1,…,arN-1,newsp] Display表 …… newsp 动态链指针 …… Display表 [ar0,ar1,…,arN-1,…] …… 动态链指针 sp Display表的求法 • NewAR.Display= CurrentAR.Display的前N项newsp;
AR(S) X单元 AR(M) AR(Q) AR(R) Z单元 Y单元 newsp Display 表 ar1 ar0 ar1 ar2 ar0 Off- Display sp 例:有过程M,Q,R,S,其中level(M)=0;level(Q)=1;level(R)=1;level(S)= 2,各AR的Display表分别如下:
局部Display表时变量的访问 • 对一个变量X(L, off),地址为: 当L= CurrentAR.level时:addr(X)=sp+off 否则: addr(X)=CurrentAR.Display[L]+ off
静态链方法 • 原Display表部分变成一个单元,称为静态链 单元,存放静态链指针。 • 静态链指针的确定: 若NewAR.level= CurrentAR.level+1-k,则 NewAR.StaticChainPointer=Indir(sp,k) 其中Indir(sp,k)表示sp的k次间接内容。 AR(M) CurrentAR NewAR AR2 AR1 ar2 ar0 ar3 ar4 ar1 sp
使用静态链时变量的访问 • 变量X(L,off)的地址: 若L= CurrentAR.Level,则addr(X)= sp+ off 若L= CurentAR.Level +1 -k,则 addr(X)= Indir(sp,k)+ off
全局Display表和寄存器方法 • 设置一个总的Display表,其长度为最大嵌 套层数(系统确定),其中Display[i]存放 第i层最新AR的指针。D[i]表示。 • 当层数为j的过程Q被调用时: 将旧的D[j]的内容保存到NewAR(Q)中: NewAR(Q).RessumeAddr = D[j]; 改写D[j]的内容:D[j] = NewAR(Q)的地址; 当退出Q时:恢复原来D[j]的内容: D[j] = CurrentAR.ResumeAddr • 变量X(L,off)的地址:addr(X)= D[L]+off
全局Display表方法的实现 sp proc P; proc Q; begin R end proc R; proc S; begin T end proc T; begin end begin S end begin Q end 全局Display表
第六章——总结 • 存储结构 • 静态、栈式、堆式存储分配的特点及所 适用的语言。 • AR的结构、内容 • 调用链、动态链、声明链、静态链、变 量访问环境的定义、构造 • 变量访问环境的实现