操作系统设计/内存管理
内存管理是指操作系统如何处理可用内存的术语。它在多个级别进行管理。
在最基本的层面上,有物理内存。物理内存的大小是系统中安装的所有内存模块(如 DDR SDRAM)的容量总和。例如,当您在系统中安装了两个 512 MiB 的 DDR SDRAM 模块时,操作系统将可以使用 1 GiB 的物理内存。
在物理内存之上是分段内存。它使用内存管理单元 (MMU) 将逻辑地址(指定段和偏移量)转换为物理地址(或线性地址)。这使得早期的计算机能够寻址超过 64 KiB 的内存。今天大多数操作系统不使用分段内存模型,而更倾向于使用分页。
分页内存模型使用 MMU 将虚拟地址转换为物理地址。使用分页,可以将多个 4 KiB 大小的块(称为页面)映射到任何虚拟地址。例如,物理内存中偏移量为 0x1000 的数据可能映射到虚拟内存中地址为 0xC0000000(偏移量为 3 GiB)的地址,即使系统可能只有 32 MiB 的物理 RAM 可用。访问地址 0xC0000000 处的数据在内部访问物理地址 0x1000 处的数据。这为进程提供了自己的虚拟地址空间,其中只包含该单个进程所需的代码和数据,而其他所有内容都隐藏起来。这样,一个进程就无法破坏另一个进程的代码或数据,从而提高了安全性 and 可靠性。
使用分页,内存以 4 KiB 大小的块进行管理。大多数应用程序需要能够获取一小部分内存来存储数据。内存分配器获取一大块内存(例如,4 个页面,或 4 * 4 KiB),并将其划分为更小的块(例如,16 字节的块和 6 字节的块),并在请求时将其提供给应用程序。
许多语言和一些操作系统使用一种称为堆的分配内存形式,它本质上是一个大的空间,可以在其中使用和重复使用内存。与堆相关的还有进行垃圾回收的需要,其中未分配的空间被合并形成更大的空间,堆从最终发生的碎片中恢复过来,这种碎片发生在使用同一空间的记录的大小在不同时间不一致时,并且被保持活动的其他分配空间保护。碎片效应会导致许多小的不可用空间散布在堆中。垃圾回收可能包括将分配的内存从一个位置移动到另一个位置,以便释放更多空间。为了使内存对内存透明,分配单元地址不能与公共地址相同,但公共地址必须是对包含分配单元地址的查找表的引用。然后,垃圾回收器可以将数据的副本写入新地址,然后在删除原始数据并允许合并过程恢复空间之前更改查找表地址。另一种技术是引用每个分配内存单元的起始点和结束点,当释放内存单元时,测试其前后单元是否为自由单元,如果是,则重新分配包含所有连续自由部分的较大块。在分配过程中,分配工具将从自由部分列表的顶部开始,查找是否有一些部分与请求的大小完全相同,如果是,则选择第一个符合条件的部分,如果没有找到完全相同大小的部分,则选择下一个最大的部分。垃圾回收可以连续进行,也可以在使用率低的时间进行,最终需要注意的是,如果找不到使用率低的时间,垃圾回收会导致整个计算机在碎片变得难以处理时暂时变慢。