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

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

活动记录结构与主要内容p234 TOP指向已用栈顶单元 T0P→ 临时单元 →存放临时变量,用于表达式计算 内情向量 →存放局部数据(数组等) 局部变量 3存放局部数据(局部变量) 3 形式单元 →保存实在参数的值或地址 2 静态链 →用于存取非局部名(display表) 连接 动态链 →保存调用者活动记录首地址(SP) 数据 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 ☒D9
2023/2/28 9 简单栈式存储分配 p234 n 用途 u 过程的局部环境 u (活动记录) n 对语言的限制 u 没有分程序结构 u 过程定义不许嵌套 u 允许过程的递归调用 n 适用语言 u C语言

C语言栈式存储组织举例 p234 全局数据说明 T0P→ main ( SP→ R的活动记录 运动态 {main中的数据说明 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 静态 确定 全局 动态 确定 局部