程序地址空间概述
基本操作系统提供了很多编写应用程序内存使用情况的服务。
可利用工具来辅助分配内存、映射内存和文件并概要分析应用程序的内存使用情况。 本节作为背景知识,描述了系统的内存管理体系结构和内存管理策略。
系统内存体系结构简介
系统使用一种通过软件扩展物理硬件能力的内存管理方案。 因为地址空间与实内存不是一一对应的,所以地址空间(以及系统将其与实内存相对应的方法)称为虚拟内存。
内核和硬件子系统相互合作以将虚拟地址转换为物理地址,它们组成了内存管理子系统。 内存管理策略由内核采用的操作构成,那些操作保证进程能平等地分享主内存。 以下几节更详细地描述了内存管理子系统的特征。
64 位系统的物理地址空间
硬件提供连续范围的虚拟内存地址,从0x00000000000000000000至0xFFFFFFFFFFFFFFFFFFFF,用于访问数据。 总的可寻址空间超过 1000000000000 TB。 内存访问指令生成一个 64 位的地址:36 位用来选择段寄存器,而 28 位用来给出在此段内的偏移量。 该寻址方案提供了对超过 6400 万个段的访问,每个段最大可达 256 MB。 每个段寄存器包含一个 52 位的段标识,该标识成为了该 28 位偏移量的前缀,它们一起构成了虚拟内存地址。 所得的 80 位虚拟地址指向一个系统范围的大型单一虚拟内存空间。
该进程空间是一个 64 位的地址空间;即程序使用 64 位指针。 然而,每个进程或中断处理程序只可寻址其段标识位于段寄存器中的系统范围虚拟内存空间(段)。
段寄存器寻址
系统内核以常规方式为所有进程装入某些段寄存器,从而隐式提供了大多数进程所需的内存可寻址性。 这些寄存器包括两个内核段、一个共享库段和一个 I/O 设备段,这些段由所有进程共享且其内容对非内核程序是只读的。 对于进程的 exec 系统调用还有一个段,在只读的基础上它与其他执行相同程序的进程、包含可读写的库数据的专用共享库数据段,以及进程的专用可读写段一起实现共享。 可以使用内存映射技术装入其余的段寄存器以提供更多的内存,或根据内核强加的访问许可权通过内存访问文件。
通过间接能力提供的系统 32 位寻址和访问给每个进程提供了一个与系统范围虚拟内存空间的实际大小无关的接口。 某些段寄存器由所有进程共享,其他段寄存器由进程的子集共享,而另外的一些段寄存器则只有一个进程才可访问。 共享是通过允许两个或更多的进程装入相同的段标识来实现的。
调页空间
为了向有限的实内存空间提供很大的虚拟内存空间,系统使用实内存作为工作空间,并将没有映射的非活动数据和程序保存在磁盘上。 包含该数据的磁盘区域称为调页空间。 页是一个虚拟内存单位,包含 4 KB 的数据并可在实际存储器和辅助存储器之间传送。 当系统需要页面空间中的数据或程序时,它执行以下操作:
- 查找当前没有活动的内存区域。
- 确保来自那个内存区域的数据或程序的最新副本位于磁盘的调页空间中。
- 将新的程序或数据从磁盘上的调页空间读入新释放的内存区域。
内存管理策略
实地址到虚拟地址的地址转换和大多数其他虚拟内存工具由“虚拟内存管理器”(VMM) 透明地提供给系统。 VMM 实现了虚拟内存,允许创建大于系统的可用物理内存的段。 它通过维护一个实内存的空闲页列表(用来检索所需转入内存的页面)来实现此功能。
VMM 有时必须通过从实内存除去某些当前页数据来补充空闲列表上的页。 在需要数据时在内存和磁盘之间移动数据的过程称为“页面调度”。 为了完成页面调度,VMM 使用将页分为三类的页面挪用算法,每一类有唯一的进入和退出条件:
- 工作存储器页
- 本地文件页
- 远程文件页
一般来说,工作页拥有最高的优先级,接下来是本地文件页,然后再是远程文件页。
此外,VMM 使用通常所说的时钟算法技术来选择要替换的页。 该技术利用每页的访问位作为哪些页最近使用(访问)过的指示。 当调用页面挪用程序例程时,它在页帧表中循环,检测每页的访问位。 如果没有访问该页且该页是可挪用的(即没有固定并符合其他页面挪用条件),那么它被挪用并置于空闲列表上。 访问页可能没有被挪用,但其访问位将复位,从而使该访问有效“老化”,这样就可能在下一次发出页面挪用算法时挪用该页。
内存分配
此操作系统的版本 3 对分配给应用程序的存储器使用延迟页面调度时间片技术。 这意味着当存储器以子例程(如 malloc)分配给应用程序时,只有在访问该存储器后才会将调页空间分配给该存储器。