• Operating System Video Tutorials

操作系统 - 内存管理



内存管理是操作系统的功能,它处理或管理主内存,并在执行过程中将进程在主内存和磁盘之间来回移动。内存管理跟踪每个内存位置,无论它是否已分配给某个进程或它是空闲的。它检查要为进程分配多少内存。它决定哪个进程将在何时获得内存。它跟踪何时一些内存被释放或未分配,并相应地更新状态。

本教程将教你与内存管理相关的基本概念。

进程地址空间

进程地址空间是进程在其代码中引用的逻辑地址集。例如,当使用 32 位寻址时,地址范围可以从 0 到 0x7fffffff;也就是说,2^31 个可能的数字,理论总大小为 2GB。

操作系统在将内存分配给程序时负责将逻辑地址映射到物理地址。在分配内存之前和之后,程序中使用了三种类型的地址:

序号 内存地址和描述
1

符号地址

在源代码中使用的地址。变量名、常量和指令标签是符号地址空间的基本元素。

2

相对地址

在编译时,编译器将符号地址转换为相对地址。

3

物理地址

加载器在程序加载到主内存时生成这些地址。

在编译时和加载时地址绑定方案中,虚拟地址和物理地址相同。在执行时地址绑定方案中,虚拟地址和物理地址不同。

程序生成的所有逻辑地址的集合称为逻辑地址空间。与这些逻辑地址相对应的所有物理地址的集合称为物理地址空间

虚拟地址到物理地址的运行时映射由内存管理单元 (MMU) 完成,MMU 是一种硬件设备。MMU 使用以下机制将虚拟地址转换为物理地址。

  • 基址寄存器的值加到用户进程生成的每个地址上,在将其发送到内存时将其视为偏移量。例如,如果基址寄存器值为 10000,则用户尝试使用地址位置 100 将被动态重新分配到位置 10100。

  • 用户程序处理虚拟地址;它永远不会看到真实的物理地址。

静态加载与动态加载

在开发计算机程序时,需要在静态加载或动态加载之间进行选择。如果必须静态加载程序,则在编译时,将编译和链接完整的程序,而不会留下任何外部程序或模块依赖性。链接器将目标程序与其他必要的目标模块组合成一个绝对程序,其中还包括逻辑地址。

如果编写的是动态加载程序,则编译器将编译程序,对于所有要动态包含的模块,只提供引用,其余工作将在执行时完成。

在加载时,使用静态加载,将绝对程序(和数据)加载到内存中以开始执行。

如果使用动态加载,库的动态例程以可重定位的形式存储在磁盘上,只有在程序需要时才加载到内存中。

静态链接与动态链接

如上所述,当使用静态链接时,链接器将程序所需的所有其他模块组合到单个可执行程序中,以避免任何运行时依赖性。

当使用动态链接时,不需要将实际的模块或库与程序链接,而是在编译和链接时提供对动态模块的引用。Windows 中的动态链接库 (DLL) 和 Unix 中的共享对象是动态库的良好示例。

交换

交换是一种机制,其中进程可以暂时从主内存(或移动)交换到辅助存储器(磁盘),并将该内存提供给其他进程。在稍后的某个时间,系统将进程从辅助存储器交换回主内存。

虽然交换过程通常会影响性能,但它有助于并行运行多个大型进程,这就是交换也被称为内存压缩技术的原因。

Process Swapping

交换过程的总时间包括将整个进程移动到辅助磁盘然后复制回内存所需的时间,以及进程恢复主内存所需的时间。

假设用户进程的大小为 2048KB,并且在进行交换的标准硬盘上的数据传输速率约为每秒 1MB。将 1000K 进程实际传输到内存或从内存传输将需要

2048KB / 1024KB per second
= 2 seconds
= 2000 milliseconds

现在考虑进出时间,它将需要完整的 4000 毫秒加上其他开销,在此期间进程竞争以恢复主内存。

内存分配

主内存通常有两个分区:

  • 低内存 - 操作系统驻留在该内存中。

  • 高内存 - 用户进程保存在高内存中。

操作系统使用以下内存分配机制。

序号 内存分配和描述
1

单分区分配

在这种类型的分配中,使用重定位寄存器方案来保护用户进程彼此不受影响,并防止更改操作系统代码和数据。重定位寄存器包含最小物理地址的值,而限制寄存器包含逻辑地址的范围。每个逻辑地址都必须小于限制寄存器。

2

多分区分配

在这种类型的分配中,主内存被分成许多固定大小的分区,每个分区只能包含一个进程。当分区空闲时,从输入队列中选择一个进程并将其加载到空闲分区中。当进程终止时,分区将可用于另一个进程。

碎片

随着进程加载和从内存中移除,空闲内存空间被分成小块。有时会发生进程由于其小尺寸而无法分配到内存块,并且内存块仍然未被使用的情况。这个问题被称为碎片。

碎片分为两种类型:

序号 碎片和描述
1

外部碎片

总内存空间足以满足请求或在其上驻留进程,但它不连续,因此无法使用。

2

内部碎片

分配给进程的内存块更大。部分内存未被使用,因为它不能被另一个进程使用。

下图显示了碎片如何导致内存浪费以及如何使用压缩技术从碎片内存中创建更多空闲内存:

Memory Fragmentation

可以通过压缩或整理内存内容来减少外部碎片,以便将所有空闲内存放在一个大的块中。为了使压缩可行,重新定位应该是动态的。

可以通过有效地分配最小但足够大的分区来减少内部碎片。

分页

计算机可以寻址的内存量大于系统上实际安装的内存量。这部分额外的内存实际上称为虚拟内存,它是硬盘的一个部分,用于模拟计算机的 RAM。分页技术在实现虚拟内存中起着重要作用。

分页是一种内存管理技术,其中进程地址空间被分成大小相同的块,称为页面(大小为 2 的幂,介于 512 字节和 8192 字节之间)。进程的大小以页面数来衡量。

类似地,主内存被分成称为的小型固定大小的(物理)内存块,并且帧的大小与页面的大小相同,以优化主内存的利用率并避免外部碎片。

Paging

地址转换

页面地址称为逻辑地址,由页号偏移量表示。

Logical Address = Page number + page offset

帧地址称为物理地址,由帧号偏移量表示。

Physical Address = Frame number + page offset

一种称为页表的数据结构用于跟踪进程的页面与物理内存中帧之间的关系。

Page Map Table

当系统将帧分配给任何页面时,它会将此逻辑地址转换为物理地址,并在页表中创建条目,在程序的整个执行过程中使用。

当要执行进程时,其对应的页面将加载到任何可用的内存帧中。假设您有一个 8KB 的程序,但您的内存在给定时间点只能容纳 5KB,那么分页概念将发挥作用。当计算机的 RAM 用尽时,操作系统 (OS) 将将空闲或不需要的内存页面移动到辅助内存以释放 RAM 供其他进程使用,并在程序需要时将其带回。

此过程在程序的整个执行过程中继续进行,其中操作系统不断将空闲页面从主内存中移除并将其写入辅助内存,并在程序需要时将其带回。

分页的优点和缺点

以下是分页的优点和缺点列表:

  • 分页减少了外部碎片,但仍然存在内部碎片。

  • 分页易于实现,并被认为是一种高效的内存管理技术。

  • 由于页面和帧的大小相等,交换变得非常容易。

  • 页表需要额外的内存空间,因此对于RAM较小的系统可能不太好。

分段

分段是一种内存管理技术,其中每个作业被分成几个大小不同的段,每个段对应一个包含执行相关功能的代码块的模块。每个段实际上是程序的不同逻辑地址空间。

当要执行一个进程时,其对应的段被加载到非连续的内存中,尽管每个段都被加载到可用的连续内存块中。

分段内存管理的工作方式与分页非常相似,但是这里的段是变长的,而分页中的页面是固定大小的。

程序段包含程序的主函数、实用函数、数据结构等等。操作系统为每个进程维护一个**段映射表**和一个空闲内存块列表,以及段号、段大小和主存中对应的内存位置。对于每个段,该表存储段的起始地址和段的长度。对内存位置的引用包括一个标识段的值和一个偏移量。

Segment Map Table
广告