第七章的瓷组织与分 编译程序必须为源程序中所出现的量(常量,变量及数组 等等)分配运行时的存储空间 分配方案选择的是否得当将关糸到资源的合狸使用,从 而会影响到程序的运行效率 存储分配的策略有忞分配与勦宠分配两类 静态分配适合于无动态申请内存,无可变长数组,无递归 调用的程序如 FORTRAN, BASIC等 勋存储分配适用面广是目前最常用的分配方案 动兖分配又有钱分配与雄分配两种
1 第七章 运行时的存储组织与分配 编译程序必须为源程序中所出现的量(常量,变量及数组 等等)分配运行时的存储空间. 分配方案选择的是否得当将关系到资源的合理使用,从 而会影响到程序的运行效率. 存储分配的策略有静态分配与动态分配两类. 静态分配适合于无动态申请内存,无可变长数组,无递归 调用的程序.如FORTRAN,BASIC等. 动态存储分配适用面广是目前最常用的分配方案 动态分配又有栈式分配与堆式分配两种
71存储组织 运行时内存的刘分 目标代码区 运行时系统为目标程序分配的存储空静态数据区 间按用途可划分为下面几个部分 1.目标代码区:存放目标程序 运行栈区 2.静态数据区:存放编译时可确定的占 用存储空间大小的数据 3.运行栈区:运行时才能分配存储空间 动态数据区 的数据区; 堆区 4堆区:用于用户动态申请存储空间 2
2 7.1 存储组织 运行时内存的划分 运行时,系统为目标程序分配的存储空 间按用途可划分为下面几个部分: 1.目标代码区: 存放目标程序; 2.静态数据区: 存放编译时可确定的占 用存储空间大小的数据; 3.运行栈区: 运行时才能分配存储空间 的数据区; 4.堆区: 用于用户动态申请存储空间 目标代码区 静态数据区 运行栈区 ↓ … ↑ 堆区 动 态 数 据 区
高储分配策略 ◆目标代码的长度在编译时就可确定,可放在静态区内; ◆对于在编译时已知大小的数据对象(如常量,全局变量 静态变量等等),也可放在静态区内; ◆为提高运行效率应尽可能多地分配静态数据空间 FORTRAN, BASIC的分配一般可全部放在静态区内. 像 PASCAL,C这类语言的实现,由于子程序允许归地调 用,因此应用一数据栈来动态地管理内存分配 ◆另外 PASCAL和C还允许动态地申请的内存,这种数据的 空间可由堆式分配实现
3 存储分配策略 目标代码的长度在编译时就可确定,可放在静态区内; 对于在编译时已知大小的数据对象(如常量,全局变量, 静态变量等等), 也可放在静态区内; 为提高运行效率,应尽可能多地分配静态数据空间. FORTRAN,BASIC的分配一般可全部放在静态区内. 像PASCAL,C这类语言的实现,由于子程序允许递归地调 用,因此应用一数据栈来动态地管理内存分配. 另外PASCAL和C还允许动态地申请的内存,这种数据的 空间可由堆式分配实现
7.12动记是 ◆执行过程时所需进行的信息管 返回的值 理,是通过活动记录实现的, 活动记录连续存储在块中,其 实参 内容见右图 任选的控制链 ◆以过程为单位的动态存储分配 任选的存取链 方案: 保存的机器状态 当一过程被调用时,就把其活动 局部数据 记录压入运行时存储栈顶,返回 临时变量 时弹出之
4 7.1.2 活动记录 执行过程时所需进行的信息管 理,是通过活动记录实现的, 活动记录连续存储在块中,其 内容见右图。 以过程为单位的动态存储分配 方案: ◼ 当一过程被调用时,就把其活动 记录压入运行时存储栈顶,返回 时弹出之。 返回的值 实参 任选的控制链 任选的存取链 保存的机器状态 局部数据 临时变量
活动记录的组成 1.临时壹量域存放目标程序临时变量的值; 2.局部数据域存放本次执行中的局部数据、简单变量、 数组内情向量等; 3.机器状态域保存在调用该过程前有关机器状态的信 息,包括各种寄存器的当前值及返回地址等; 任的存取为访问其它活动记录中所存放的非局 部数据提供链地址( PASCALI中用到); 5.任选的控制链用于指向主调过程的活动记录; 6.实在参數存放主调过程为被调过程提供的实参信息; 7.饭回值域被调过程用来为主调过程存放返回值的域;
5 活动记录的组成 1. 临时变量域 存放目标程序临时变量的值; 2. 局部数据域 存放本次执行中的局部数据、简单变量、 数组内情向量等; 3. 机器状态域 保存在调用该过程前有关机器状态的信 息,包括各种寄存器的当前值及返回地址等; 4. 任选的存取链 为访问其它活动记录中所存放的非局 部数据提供链地址(PASCAL中用到); 5. 任选的控制链 用于指向主调过程的活动记录; 6. 实在参数 存放主调过程为被调过程提供的实参信息; 7. 返回值域 被调过程用来为主调过程存放返回值的域;
活动记录的组成(续) ◆每个舞动记录都可分为定长部分和可变部分 定长部分用于存放在编译时就能确定其体积的 量,如简单变量、常界教組等; ◆可变部分适用于存放只有在运行时才能确定其 体积的量,如可变数组等 虽然可变数組的体积在动态运行时才能确定,但 其地址的访问却在编译时就可确定,即通过活司 记录的首地十偏鸦量来访问.因为与它的体积 有关的信息(如内情向量)是在定长部分存放的
6 活动记录的组成(续) 每个活动记录都可分为定长部分和可变部分. 定长部分 用于存放在编译时就能确定其体积的 量,如简单变量、常界数组等; 可变部分 适用于存放只有在运行时才能确定其 体积的量,如可变数组等. 虽然可变数组的体积在动态运行时才能确定,但 其地址的访问却在编译时就可确定,即通过活动 记录的首地址+偏移量来访问.因为与它的体积 有关的信息(如内情向量)是在定长部分存放的
72选行时的分配策略 7节所示的数据区的组织,各自「日标代码区 使用了不同的存储分配策略: n静态分配; 静态数据区 栈式分配(小亦称栈式动态分配) 运行栈区 堆式分配亦称堆式动态分配) 态数据区 堆区
7 7.2 运行时的分配策略 7.1节所示的数据区的组织,各自 使用了不同的存储分配策略: ◼ 静态分配; ◼ 栈式分配(亦称栈式动态分配); ◼ 堆式分配(亦称堆式动态分配). 目标代码区 静态数据区 运行栈区 ↓ … ↑ 堆区 动 态 数 据 区
7.2.1静念分配 ◆若在编译阶段就能确定源程序中各个数据实体的存储空 间大小,则可以采用较简单的静态亭储管碧 适合静管理的语言应具备下述条件: 日数組上下界是常数; 过程调用采允许递; ■采允许动志建立数据实体。 满足上述条件的语言有 FORTRAN、 BASIC等。 由于过程调用无递归,过程的活动记录可直接安排在程 序代码之后,执行时不必进行运行时的存储管理
8 7.2.1 静态分配 若在编译阶段就能确定源程序中各个数据实体的存储空 间大小,则可以采用较简单的静态存储管理 适合静态管理的语言应具备下述条件: ◼ 数组上下界是常数; ◼ 过程调用不允许递归; ◼ 不允许动态建立数据实体。 满足上述条件的语言有FORTRAN、BASIC等。 由于过程调用无递归,过程的活动记录可直接安排在程 序代码之后,执行时不必进行运行时的存储管理
FORTRAN语言的 静态存储分配 FORTRAN程序中各程序段均可独立进 行编译; 临时变量 数组 在编译时,为程序段中的量分配单元的简单变量 方法是,为每个量确定一个整数对 mm],其中■指明数据区编号,Ⅲ指明 该存储单元在数据区相对于首单元的偏形式单元 移量,并把此对填入符号表中。 各数据区首单元地址暂不确定,待各程 序段全部编译完后再由连接程序指定。 隐参数(返回 地址、寄存器 FORTRAN局部数据区内容见右图。 内容等)
9 FORTRAN语言的 静态存储分配 FORTRAN程序中各程序段均可独立进 行编译; 在编译时,为程序段中的量分配单元的 方法是,为每个量确定一个整数对 (m,n),其中m指明数据区编号,n指明 该存储单元在数据区相对于首单元的偏 移量,并把此对填入符号表中。 各数据区首单元地址暂不确定,待各程 序段全部编译完后再由连接程序指定。 FORTRAN局部数据区内容见右图。 临时变量 数组 简单变量 形式单元 隐参数(返回 地址、寄存器 内容等)
各程感数溷区的分配 容股局部薮据区的分配有种亦柰 (1)不考虑各段间的调用关系,各自独立占有互不相交的 空间: (2)划定一连续空间,在定义各局部数据区时根据相互间 的调用(或不调用)关系,安排最合理的分配方案
10 各程序段数据区的分配 各段局部数据区的分配有两种方案: (1)不考虑各段间的调用关系,各自独立占有互不相交的 空间; (2)划定一连续空间,在定义各局部数据区时,根据相互间 的调用(或不调用)关系,安排最合理的分配方案