
第9章运行时存储空间组织 n概述 n9.1运行时存储组织 U存储分配策略(重点) n9.2活动记录栈式存储分配的实现 F简单的栈式存储分配(C语言) F嵌套过程语言的栈式实现(略) n9.3过程调用:参数传递(略) n本章练习 2023/2/28 课程目录国☑1
2023/2/28 1 第9章 运行时存储空间组织 n 概述 n 9.1 运行时存储组织 u 存储分配策略(重点) n 9.2 活动记录 栈式存储分配的实现 F 简单的栈式存储分配(C语言) F 嵌套过程语言的栈式实现 (略) n 9.3 过程调用:参数传递(略) n 本章练习 课程目录

概述p229 n任务 u对目标程序运行时的数据空间的组织和管理 n逻辑阶段 u在目标代码生成前,作准备 n实质:解决关联问题 绑定Binding) u源程序的文本—程序运行动作的实现 u源文件中的名字N一运行时的存储单元S 2023/2/28 国D2
2023/2/28 2 概述 p229 n 任务 u 对目标程序运行时的数据空间的组织和管理 n 逻辑阶段 u 在目标代码生成前,作准备 n 实质:解决关联问题 绑定(Binding) u 源程序的文本——程序运行动作的实现 u 源文件中的名字N——运行时的存储单元S

运行时存储器的典型划分 p230 低目标代码区 存放程序的目标代码, 编译时确定 静态数据区 存放静态数据对象 J静态存储分配 栈区 管理过程调用 存放过程活动 运行时确定 所需的相关信息 动态存储分配 相向增长 栈式动态 空闲存储空间 可有效利用空间 堆式动态 实现动态数据分配 高堆区 调用mal1oc等函数 时申请的存储空间 2023/2/28 章节目绿国
2023/2/28 3 运行时存储器的典型划分 p230 低目标代码区 静态数据区 栈 区 高 堆 区 存放程序的目标代码 存放静态数据对象 管理过程调用 存放过程活动 所需的相关信息 实现动态数据分配 调用malloc等函数 时申请的存储空间 空闲存储空间 相向增长 可有效利用空间 编译时确定 运行时确定 静态存储分配 动态存储分配 栈式动态 堆式动态 章节目录

9.1.3 存储分配策略P231 n静态分配策略p231 u编译时对所有数据对象分配固定的存储单元 u且在运行时始终保持不变 n栈式存储分配p232 u运行时把存储器作为一个栈进行管理 u 每当调用一个过程,它所需的存储空间就动 态地分配于栈顶 u一旦退出,它所占空间就予以释放 n堆式存储分配p233 u在运行时把存储器组织为堆 u允许用户动态申请和归还存储空间 u凡申请者从堆中分给一块,凡释放者退回给堆 2023/2/28 章节目录国区
2023/2/28 4 9.1.3 存储分配策略 P231 章节目录 n 静态分配策略 p231 n 栈式存储分配 p232 n 堆式存储分配 p233 u 编译时对所有数据对象分配固定的存储单元 u 且在运行时始终保持不变 u 运行时把存储器作为一个栈进行管理 u 每当调用一个过程,它所需的存储空间就动 态地分配于栈顶 u 一旦退出,它所占空间就予以释放 u 在运行时把存储器组织为堆 u 允许用户动态申请和归还存储空间 u 凡申请者从堆中分给一块,凡释放者退回给堆

9.2活动记录栈式存储分配的实现 p234 n过程的活动举例 float fac(int n) 为方便讨论,程序和函 {float f; 数也看作过程。有C程序: if(n=0)f=1; else f=n*fac (n-1); n执行时过程调用顺序: return f; fac(0) 返回值1 main() fac(1) {int i=2; 返回值1 printf(%f”,fac(i) fac(2) ↑N 返回值2 ):n定义了两个过程 main 运行栈main fac(n) 显示2 程序运行结束 2023/2/28
2023/2/28 5 9.2 活动记录栈式存储分配的实现 p234 n 过程的活动举例 为方便讨论,程序和函 数也看作过程。有C程序: float fac(int n) {float f; if (n==0) f=1; else f=n*fac(n-1); return f; } main( ) {int i=2; printf(“%f”,fac(i) ); } n 定义了两个过程 main fac(n) main ↑ fac(2) ↑ fac(1) n 执行时过程调用顺序: ↑ fac(0) main的活动 fac的活动,n=2 fac的活动,n=1 fac的活动,n=0 运行栈 返回值1 返回值1 返回值2 显示 2 ↓ ↓ ↓ 程序运行结束

定义 过程的活动p234 n一个过程的活动 u是指该过程的一次执行 u每次执行一个过程体,产生该过程体的一个活动 n一个活动的生存期 u是指从该过程体的第一步操作到最后一步操作之 间的操作序 u包括执行该过程时调用其它过程花费的时间 n名字说明作用域 u一个说明在程序里能起作用的范围 2023/2/28
2023/2/28 6 定义 过程的活动 p234 n 一个过程的活动 u 是指该过程的一次执行 u 每次执行一个过程体,产生该过程体的一个活动 n 一个活动的生存期 u 是指从该过程体的第一步操作到最后一步操作之 间的操作序 u 包括执行该过程时调用其它过程花费的时间 n 名字说明作用域 u 一个说明在程序里能起作用的范围

活动记录(Activation Record)bp235 含义:存储管理过程活动所 需信息的一块连续的存储空间 目标代码区 临时单元 静态数据区 内情向量 活 栈区 局部变量 动 运行栈区中的二二二二二二二二三 记 形武单元 静态链 个栈单元 录 动态链 返回地址 n 作用:当调用过程时,将在栈顶 堆区 为过程此次活动分配活动记录 2023/2/28 ☒7
2023/2/28 7 活动记录(Activation Record) p235 临时单元 内情向量 局部变量 形式单元 静态链 动态链 返回地址 运行栈区中的 一个栈单元 目标代码区 静态数据区 栈 区 堆 区 n 含义:存储管理过程活动所 需信息的一块连续的存储空间 活 动 记 录 n 作用:当调用过程时,将在栈顶 为过程此次活动分配活动记录

活动记录结构与主要内容p234 TOP指向已用栈顶单元 T0P→ 临时单元 存放临时变量,用于表达式计算 内情向量 →存放局部数据(数组等) 局部变量 >存放局部数据(局部变量) 3 形式单元 →保存实在参数的值或地址 2 静态链 →用于存取非局部名(display表) 连接 1 动态链 保存调用者活动记录首地址(SP) 0 返回地址 目标代码中的返回地址 第一个形参 SP指向现行过程(即最 相对地址(相对数)=3 新进入工作的那个过程) 栈中绝对地址=SP+3=3[SP] 的活动记录在栈里的首地 址,用于访问局部数据 2023/2/28 章节目录国☑
2023/2/28 8 活动记录结构与主要内容 p234 返回地址 动态链 静态链 形式单元 局部变量 内情向量 临时单元 存放临时变量,用于表达式计算 存放局部数据(数组等) 存放局部数据(局部变量) 保存实在参数的值或地址 用于存取非局部名(display表) 保存调用者活动记录首地址(SP) SP 目标代码中的返回地址 TOP TOP 指向已用栈顶单元 SP 指向现行过程(即最 新进入工作的那个过程) 的活动记录在栈里的首地 址,用于访问局部数据 连接 数据 0 1 2 3 第一个形参 相对地址(相对数)=3 栈中绝对地址=SP+3=3[SP] 章节目录

简单栈式存储分配p234 n用途 u过程的局部环境 u(活动记录) n对语言的限制 u没有分程序结构 u过程定义不许嵌套 u允许过程的递归调用 n适用语言 uC语言 2023/2/28 ☒g
2023/2/28 9 简单栈式存储分配 p234 n 用途 u 过程的局部环境 u (活动记录) n 对语言的限制 u 没有分程序结构 u 过程定义不许嵌套 u 允许过程的递归调用 n 适用语言 u C语言

C语言栈式存储组织举例 p234 全局数据说明 T0P→ main ( R的活动记录 运动态 {main中的数据说明 SP→ Q的活动记录 行确定 .Q0;.} 栈局部 void R() main的活动记录 {R中的数据说明 全局数据 静态 } 确定 void Q() 目标代码 全局 {Q中的数据说明 .R0;} 执行过程main→Q→R 2023/2/28
2023/2/28 10 C语言栈式存储组织举例 p234 全局数据说明 main() { main中的数据说明 .Q();.} void R() { R中的数据说明 .} void Q() { Q中的数据说明 .R();.} 目标代码 全局数据 运 行 栈 执行过程 main main的活动记录 SP TOP → Q Q的活动记录 SP TOP → R R的活动记录 SP TOP 静态 确定 全局 动态 确定 局部