运行时存储管理

2025 年 7 月 7 日 | 阅读 4 分钟

引言

在本文中,我们将详细解释运行时存储管理的概念,并提供一些优点、缺点和示例。

什么是运行时存储管理?

运行时存储环境是目标计算机寄存器和内存的结构,用于管理内存并跟踪运行程序所需的信息。

它包括以下信息

  • 软件库
  • 环境变量

在过程执行期间需要的信息保存在称为激活记录的存储块中。 激活记录包括过程本地名称的存储空间。

激活记录包含以下信息

序号信息描述
1局部变量它用于保持函数执行的本地数据
2临时值它保留在表达式评估期间形成的值。
3机器状态这保存有关函数调用之前机器状态的信息。
4访问链接这指的是其他激活记录中保存的非本地数据。
5控制链接这些指向调用者的激活记录。
6返回值调用过程使用它来向调用过程返回值。
7实际参数它用于存储实际参数,这些参数用于将输入传递给函数。

我们可以使用以下方法来描述目标代码中的地址

  1. 静态分配
  2. 堆栈分配

在静态分配中,激活记录的位置在编译时在内存中是固定的。

在堆栈分配中,对于过程的每次执行,一个新的激活记录被压入堆栈。 当激活结束时,记录被弹出。

对于激活记录的运行时分配和解除分配,以下三地址语句相关联

  1. 调用
  2. 返回
  3. 停止
  4. Action,其他语句的占位符

我们假设运行时内存被划分为以下区域

  1. 代码
  2. 静态数据
  3. Stack

静态分配

1. 调用语句的实现

需要以下代码来实现静态分配

其中,

callee.static_area 显示激活记录的地址。

callee.code_area 显示被调用过程的第一条指令的地址。

#here + 20 字面量用于返回 GOTO 后面的指令的地址。

2. 返回语句的实现

需要以下代码来实现从过程 callee 返回

它用于将控制权转移到保存在激活记录开始处的地址。

3. Action 语句的实现

ACTION 指令用于实现 action 语句。

4. Halt 语句的实现

HALT 语句是用于将控制权返回给操作系统的最终指令。

堆栈分配

使用相对地址,静态分配可以变为堆栈分配,用于激活记录中的存储。

在堆栈分配中,寄存器用于存储激活记录的位置,因此可以作为此寄存器中值的偏移量来访问激活记录中的字。

需要以下代码来实现堆栈分配

1. 堆栈的初始化

2. 调用语句的实现

其中,

caller.recordsize 是激活记录的大小

#here + 16GOTO 指令之后的指令的地址

3. 返回语句的实现

运行时存储管理的优点

以下是运行时存储管理的各种优点的列表

  • 可移植性: 由于编译代码和操作系统之间的抽象,使得将程序移植到不同的平台变得容易。
  • 异常处理: 它可以处理允许程序避免错误的异常。
  • 资源管理: 它可以控制系统资源,例如 CPU 内存和时间,从而更容易避免诸如内存泄漏和其他与资源相关的问题。
  • 动态内存分配: 运行时环境提供动态内存分配,在程序执行期间根据需要分配内存。
  • 垃圾回收: 它会自动释放程序不再使用的内存。

运行时存储管理的缺点

以下是运行时存储管理的各种缺点的列表

  • 调试: 在运行时环境中进行调试更加困难。
  • 版本问题: 运行时环境的每个更新版本可能具有不同的功能,这可能会导致版本控制问题。
  • 性能开销: 运行时环境需要额外的性能开销,因为它需要更多的处理和内存使用。
  • 平台依赖性: 大多数运行时环境特定于某些平台,这使得将程序移植到其他平台变得困难。

关于运行时存储管理的常见问题

1. 列出与激活记录的分配和解除分配相关的不同地址语句?

答案

  • 调用
  • 返回
  • Halt 
  • 操作

2. 你所说的存储分配是什么意思?

答案:这是将存储空间与变量关联的过程,以便可以将变量表示的数据项在内部记录下来。

3. 列出堆栈分配的一些缺点?

答案

以下是堆栈分配的各种缺点的列表。

  • 如果分配了数组,则无法扩展数组,因为我们无法在分配数组的堆栈之间添加更多空间
  • 它不能在函数和函数调用内部本地使用。

下一主题基本块