内存管理的必要性
-
很早之前计算机只能运行单个进程,就算运行批处理程序,也是棑好对,一个一个的进行处理,不存在多个进程并发运行,这时候内核对于内存管理相对比较简单,直接把物理内存地址拿过来是使用即可。
-
随着计算机演进,支持多进程的OS,多个进程都都使用同一个物理地址空间,很容易多个进程之间相互干扰而引起进程的不可预期的行为。为了解决这个问题,CPU中的MMU(内存管理单元)引入了虚拟地址空间。以32位操作系统经为例,每个进程都可以拥有4G的寻址空间,当进程需要内存时候,通过转换技术和虚拟地址进行关联。MMU通过分页的机制,提供进程的虚拟地址到物理地址的映射方法。段页机制是MMU机制提供,Linux内核是使用者。
MMU的内存管理机制
-
在x86体系结构下CPU对内存寻址都是通过分段和分页方式进行,在保护模式下,一个段的可以理解为
基地址+段的界线+类型
。进程的虚拟地址就是在段中的偏移量;线性地址就是在某个段中基地址+偏移地址
得出的地址;在x86中MMU提供了分页机制,如果未开启,那么线性地址就是物理地址;反之需要经过分页机制换算后,线性地址才能转为物理地址。MMU对于内存的管理主要是分段和分页,CPU把生成的逻辑地址交给MMU内的分段单元,分段单元为每个逻辑地址生成一个线性地址,然后再将线性地址交给MMU的分页单元,最终生成物理内存的地址。
分页(Paging)
分页是一种无需连续分配物理内存的内存管理方案。进程的地址空间被划分为固定大小的块,称为页,而物理内存被划分为固定大小的块,称为帧。
关键概念
-
页:进程地址空间的固定大小块。
-
帧:物理内存的固定大小块。
-
页表:用于将虚拟地址映射到物理地址的数据结构。页表中的每个条目对应一个页面,并包含该页面所在帧的编号。
地址转换过程分为 3 个步骤
-
逻辑地址空间:逻辑地址(由 CPU 生成)分为页码和页偏移量。
-
页表查找:页码作为页表的索引,用于查找相应的帧号。
-
物理地址形成:帧号与页偏移量相结合,形成内存中的物理地址。
优点
-
消除外部碎片。
-
简化内存分配。
-
支持高效的交换和虚拟内存。
缺点
-
可能导致内部碎片。
-
页表需要额外内存。
-
由于多次访问内存,地址转换速度较慢。
分段(Segmentation)
分段是一种内存管理技术,根据程序的逻辑划分(如函数、对象或数据数组),将内存划分为大小可变的段。
关键概念
-
段:程序的逻辑划分,每个段的大小可变。
-
段表:将段号映射到段的基地址和长度的数据结构。
地址转换过程分为 3 个步骤
-
逻辑地址空间:逻辑地址包括段号和段内偏移量。
-
段表查找:段号用作段表的索引,用于查找段的基地址。
-
物理地址形成:将基址与偏移量相加,形成内存中的物理地址。
优点
-
为程序的不同部分提供逻辑分隔。
-
便于保护和共享程序段。
-
简化对不断增长的数据结构的管理。
缺点
-
可能导致外部碎片。
-
内存管理更复杂。
-
由于多次访问内存,地址转换速度较慢。
分段和分页的比较
-
内存分配:分页将内存划分为固定大小的单元,而分段将内存划分为可变大小的单元。
-
碎片:分页消除了外部碎片,但可能导致内部碎片。分段可导致外部碎片,但可避免内部碎片。
-
地址转换:分页涉及页表,而分段使用段表。
-
逻辑视图:分页更直接,但不太符合程序的逻辑视图。分段与程序内的逻辑划分更为一致。
总之,分页和分段都有自己独特的内存管理方法,各有利弊。在某些系统中,它们还可以结合使用,以发挥两种技术的优势。
混合分页和分段
有些系统结合使用这两种技术,以发挥各自的优势。例如,可以将一个分段划分为多个页面,以便从分段的逻辑组织和分页的简便性中获益。这种混合方法有助于减轻单独使用其中一种技术的缺点。
优点
-
结合了分页和分段的优点。
-
减少外部碎片(来自分段)和内部碎片(来自分页)。
缺点
-
增加了内存管理的复杂性。
-
由于需要同时管理段表和页表,因此开销较大。