当前位置:文档之家› 第六章 运行时的存储组织与管理

第六章 运行时的存储组织与管理


4
1) 静态变量(Static Variable)
所需的存储区大小固定、在编译时可确定大小、 编译时分配空间、运行时绑定于一个存储区,不 会随所在的程序单元(过程、子程序)调用/返回 而改变存储位置。这类变量称为静态变量。
2) 半静态变量(Semistatic Variable)
所需的存储区大小固定、在编译时可确定大小、 编译时分配空间,但随所在的程序单元调用而被 绑定,返回而失去空间,并可能会在存储空间留 有多个副本。在运行时可知(动态可确定),称 为半静态变量。
b) 显式:通过执行释放命令来释放无用空间,由程 序员完成。如C语言中的free(..)。
缺点是引起如“悬摆指针”这样的致命错误。
2020/5/24
华东师大计算机科学技术系
11
c) 隐式:即自动回收无用的堆空间,由系统完成, 称为“无用单元收集”(garbage Collection)
常用方法:
i. 单引用:不允许同一存区由多于一个引用存在, 一旦引用改变指向,就释放该存区。此方法简 单,但只适用简单数据类型,而不适合复杂的 数据类型,如图、网等。
2020/5/24
华东师大计算机科学技术系
17
二、静态/半静态变量的访问
i. 局部变量的访问: 局部变量——本过程(分程序)中定义的数据实体 设立了当前栈指针SP,其指向当前AR首址。 访问AR中数据实体x的公式为: SP+Dx Dx为x的位移量
ii. 非局部变量的访问: 非局部变量——所有在静态外层的过程(分程序) 中定义的数据实体
ii. 引用计数:对每个存区设立一个引用计数,当 计数为零时释放,如COM。
iii. 废区自动收集:跟随所有得到的存区的指针, 不断地标识所有可存取的堆目标,定时地检查 存区是废区就回收。将消耗大量的时/空资源。
2020/5/24
华东师大计算机科学技术系
12
§3. 栈式分配
• 适合进行栈式分配一类语言(或变量)的特点为: i. 子程序调用关系是后进先出的栈模型 ii. 静态嵌套的程序结构,采用静态作用域规则 iii. 允许半静态、半动态变量 一、存储管理模式
• 联编有二种:
i) 静态联编(早期,early) 编译、链接时进行
ii) 动态联编(滞后,late)运行时进行
• 变量的存储分配,尤其是局部于过程(子程序) 的变量的存储分配、绑定的要求和方法对存储分 配的管理的实施有着直接的影响。如从这个角度 考察变量,通常可将变量分为四类:
2020/5/24
华东师大计算机科学技术系
2020/5/24
华东师大计算机科学技术系
1
堆空间 动 态 区
栈空间
库模块及分别编译的
静 模块代码和静态数据
态全局数据区区 Nhomakorabea主过程代码
保留区
高地址
每个模块有自己 的代码区和数据 区,由链接、装 配程序分配,并 确定相对于定位 单元的偏移量
低地址
2020/5/24
华东师大计算机科学技术系
2
• 注意:
SP
B’s AR
F’s AR
A’s AR
a. 要求:在B中只能访问B中的局部量和A中的非局 部量,不能访问F中的变量。
b. 静态嵌套层次与动态的栈区布局不一致。
c. 如何才能访问A中的变量?如何保证F中变量不被 访问到?
2020/5/24
华东师大计算机科学技术系
20
双指针方法
• 存储分配以unit为单位,在每个AR中设立静态嵌套 层号、动态和静态指针,其中:
iii. 调用点的机器状态
iv. 形实参数通讯区
v. 返回值
vi. 被调用过程的局部量和临 时变量存储区
2020/5/24
华东师大计算机科学技术系
14
• 程序单元一般可以以过程或分程序为单位,主要 讨论以过程为单位。一旦知道过程的静态嵌套层 号,AR所需的存储空间的大小是确定的。
• AR的管理方法为:
例如:在允许递归语言中的递归过程中的变量。
2020/5/24
华东师大计算机科学技术系
5
3) 半动态变量(Semidynamic Variable)
主要指数组。所需存储区大小未知,但维数编译 时已知,因此信息向量表的大小确定,是半静态 的,数组元素的实际存储区则在运行时分配、绑 定。例如:数组元素将被分配在二级存储区中。
• 说明:
i. 在FORTRAN语言中有二类特殊的语句说明数据 实体。
a) COMMON语句与COMMON区。在COMMON 区中存放的是COMMON语句所定义的变量,功 能上相当于全局变量。
b) 等价语句(EQUIVALENCE)。为降低空间开销, 使用的一种覆盖技术,但覆盖会导致出现难以理 解的错误。
栈 增
Q’s AR (1)

call Q

p’s AR

call p
main’s AR
过程的一次执行对应一个AR,解决了过程递 归的数据区管理问题!
2020/5/24
华东师大计算机科学技术系
16
• 为保证SP总指向当前AR首址,要求: i. 调用发生时,在新建立的AR中保存当时的SP
(称为oldSP)。 ii. 改变SP的当时值,使其指向新的AR。 iii. 过程执行结束时,取出oldSP,恢复为当前的SP。
第六章 运行时的存储组织与管理
• 运行时存储管理是指目标程序对存储空间的使用和 再使用的方法。
• 目的:对内存使用的经济性和对各数据实体访问的 方便性及高效率。
• 为达到这一目的,必须营造一个环境支持存储空间 的管理。
• §1. 存储分配 一、存储空间
程序再运行时,系统为该目标程序分配一块空间, 主要存放代码和数据,一个典型的内存格局为:
2. 动态分配策略
i. 若分配的存区长度固定,则可以将组织成链, 这样分配、释放等操作就成为相应的链操作。
ii. 如长度可变,常用的分配策略有:
2020/5/24
华东师大计算机科学技术系
10
a) 最优满足法(best-fit method):寻找一块剩余最 少的自由块。效率较差:引起小(无用)碎片增 多。
b) 首次满足法(first-fit):选择第一个找到的足够大 的自由块。
c) 循环首次满足法(Circular first fit):类似b),但 不同的是开始搜索不总是起点,而是当前的搜索 点。
3. 释放策略
a) 不释放(ignore):空间用完了就停止或从头分配。 并不很差,尤其对空间较大的环境。
动态链 dynamic link
静态链 static link
机器状态 machine states
参数单元 parameters
局部变量 local variables
临时变量 temporaries
低地址 高地址
i. 被调用过程非局部变量存 储区的首地址(静态链、 Display表)
ii. 调用过程的AR首址(动 态链,oldSP)
注意:这儿不考虑形参过程!
2020/5/24
华东师大计算机科学技术系
22
• 例3:一个类PASCAL的程序框架为:
program mian procedure P
• 程序流进入过程R时,运行栈为:
procedure R
begin
end R
SP
begin
CALL R end P procedure Q begin
4) 动态变量(Dynamic Variable)
存储区大小不能确定、且可能变化。即使到所在 程序单元被激活(被调用)仍然未知,或者对数 组而言信息向量表的大小未知,只有到使用时才 能确定并被绑定。称为动态变量。
一般而言,1)存放在静态区,2)3)在栈区,4)在堆区
2020/5/24
华东师大计算机科学技术系
将一个程序单元(Program Unit)的每一次激活所 需的信息存放在一个连续的存储区域,该区域称 为活动记录(Activation Record) 。当前的AR首地 址由栈指针SP指出。 • AR中通常应包含如下内容:
2020/5/24
华东师大计算机科学技术系
13
返回指针 returned pointer
6
§2. 存储管理
• 编译程序根据不同的语言、不同的数据实体对存 储分配的要求,采用不同的管理模式,一般有三 类:
一、静态存储管理模式
如果程序语言只允许静态变量,那么变量与存储 区域的绑定关系在编译时便可建立,并完成存储 分配。这一类语言便是静态语言。它们不允许递 归调用,不允许动态数组,不允许动态类型的数 据对象,即不允许有非静态变量。FORTRAN、 COBOL便是静态语言。
iv. 堆区存放动态申请存储空间的动态变量及不遵守 栈式规则的过程中的数据,如ADA的“task”。
2020/5/24
华东师大计算机科学技术系
3
二、变量的存储分配
• 程序中使用的变量必须为其分配存储空间,称将 一个数据实体的名(ID)和存储地址相联系(分 配地址)为联编(Binding,绑定) ,变量获得存 储区的这种活动称为分配(Allocation)。
2020/5/24
华东师大计算机科学技术系
8
ii. 静态分配也适用于许多语言中的静态变量。如全 局变量。
– 在Modula-2中一个模块的局部量
– Ada语言中最高层模块(包)(Top-level packages)中定义的变量
– C语言中的外部变量、静态变量
2020/5/24
华东师大计算机科学技术系
注意:包括全局量。
2020/5/24
华东师大计算机科学技术系
18
unit A; a1: int; unit B; a2: int; unit C;
相关主题