1 / 23

第六章 运行时的存储空间

第六章 运行时的存储空间. 运行时存储空间的结构和分配 过程活动记录 AR 运行时变量的访问. 运行时的存储空间结构. 要保存的信息: 目标代码;数据;库函数代码;数据信息表; 控制信息等 运行时的存储空间结构:. 最大地址. 堆区空间 栈区空间. 最小地址. 库代码空间. 静态区空间. 目标代码空间. 运行时静态区的分配. 存储对象的存储位置在程序的整个生命 周期是固定的。 分配对象: 全程变量 常量 信息表 分配方法: 块地址法:( DataArea,Offset)

vance-drake
Download Presentation

第六章 运行时的存储空间

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第六章 运行时的存储空间 • 运行时存储空间的结构和分配 • 过程活动记录AR • 运行时变量的访问

  2. 运行时的存储空间结构 • 要保存的信息: 目标代码;数据;库函数代码;数据信息表; 控制信息等 • 运行时的存储空间结构: 最大地址 堆区空间 栈区空间 最小地址 库代码空间 静态区空间 目标代码空间

  3. 运行时静态区的分配 • 存储对象的存储位置在程序的整个生命 周期是固定的。 • 分配对象: 全程变量 常量 信息表 • 分配方法: 块地址法:(DataArea,Offset) 变址模式:(Register,Offset)

  4. 栈区的存储分配 • 存在递归调用 • 存储对象: 过程中被声明的形参、局部变量 临时变量 • 分配方法: 对每个被调用过程分配一段存储空间,sp存放当前 过程空间的开始地址;对变量X:(Level,off), 则其存放地址为off[sp]。 过程结束时自动释放空间; • 不能存储: 值的生命周期长于过程的变量; 动态申请空间的变量;

  5. 堆区的存储分配 • 可随时分配和释放空间 • 存储对象: 动态申请空间的变量的值 • 释放空间方法: 显示释放: 隐式释放:单指针释放 计数释放法 标记释放法 • 分配空间方法: 最佳符合法;首次优先法;循环首次优先法

  6. 运行时的过程活动记录与栈区的组织结构 • 过程活动记录(AR):过程的一个现场记录 • 记录内容: 过程控制信息:先行活动记录的动态链指针、 返回地址、层数和长度等 机器状态信息:寄存器状态等 全局变量信息: 非局部变量的信息 局部变量值:形参变量、局部变量和临时变量

  7. 临时变量区 局部变量区 AR的结构: 本层变量和返回值 形参变量区 返回值 全局变量信息 全局变量环境 机器状态信息 机器状态 过程层数 控制状态信息 返回地址 动态链指针 sp

  8. 例: 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

  9. 动态链 • 调用链 :过程名序列 若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)]

  10. 调用过程Q时:  新产生活动记录NewAR  填写NewAR的内容: 动态链指针:=sp; 填写返回地址、层数、大小和机器状态 sp:=sp+CurrentAR.Size;  转向Q子程序。 • 退出过程Q时:  (R1,R2,...,Rn) := CurrentAR.Machine;  Value:=CurrentAR.ReturnValue;  sp:=CurrentAR.DynPointer;.  按原CurrentAR.return返回;

  11. 活跃活动记录(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)

  12. 运行时的变量访问 • 过程声明链(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)]

  13. 若(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

  14. 变量访问环境的实现方法 • Display表方法 全局表法 局部表法 • 静态链方法 • 寄存器方法

  15. 局部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表.

  16. …… [ar0,ar1,…,arN-1,newsp] Display表 …… newsp 动态链指针 …… Display表 [ar0,ar1,…,arN-1,…] …… 动态链指针 sp Display表的求法 • NewAR.Display= CurrentAR.Display的前N项newsp;

  17. 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表分别如下:

  18. 局部Display表时变量的访问 • 对一个变量X(L, off),地址为: 当L= CurrentAR.level时:addr(X)=sp+off 否则: addr(X)=CurrentAR.Display[L]+ off

  19. 静态链方法 • 原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

  20. 使用静态链时变量的访问 • 变量X(L,off)的地址: 若L= CurrentAR.Level,则addr(X)= sp+ off 若L= CurentAR.Level +1 -k,则 addr(X)= Indir(sp,k)+ off

  21. 全局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

  22. 全局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表

  23. 第六章——总结 • 存储结构 • 静态、栈式、堆式存储分配的特点及所 适用的语言。 • AR的结构、内容 • 调用链、动态链、声明链、静态链、变 量访问环境的定义、构造 • 变量访问环境的实现

More Related