在前面几期中,我们分别了解了 Linux内存管理模块 的其他四大模块:
本期呢,我们就来了解 Linux内存管理模块 的最后一大模块:物理内存管理模块

首先,我们来看物理内存管理的重要性:
物理内存是计算机硬件中用于存储程序和数据的实际内存芯片,也称为主存储器(Main Memory)。
物理内存的容量是计算机系统硬件的重要指标之一,它直接决定了计算机能够处理的数据量大小和运行速度。
有效的物理内存管理可以提高内存的利用率,减少内存碎片,优化系统性能,并避免内存泄漏等问题。
然后呢,我们来了解一下 Linux 的两种管理物理内存的方式
1、系统尽可能采取的方式 - 连续内存管理
连续内存管理是指为一个用户程序分配连续的物理内存空间。
在这种管理方式中,程序可以通过指针直接访问任何一个物理内存地址。
连续内存管理的特点是实现简单,内存访问速度快,因为CPU可以直接通过地址访问内存。

2、运行时间长之后产生了大量物理内存碎片后的方式 - 非连续内存管理
非连续内存管理指在物理内存中不必按照连续的物理地址顺序分配内存空间。
常见的非连续内存管理方式有分页式和分段式两种。
相比于连续内存管理,它更灵活,但是它实现相对复杂,且需要更多的硬件和软件支持,而且会带来一定的性能开销。

比较一下:

那它们两个分别是用什么方法来管理的呢?
连续的物理内存的“管理员” - 伙伴系统算法
总之伙伴系统会尽可能将小块内存合并为大块内存。
当需要分配一块内存时,伙伴系统会尝试找到大小合适的内存块,如果找到的块比需要的块稍大,就会将其一分为二。
分成两个大小相等的伙伴块,并将其中一个块作为分配给请求方的内存块,另一个块则继续留给系统进行分配。
当内存块被释放时,伙伴系统会尝试将其与相邻的块合并成一个更大的块,以便后续的内存分配。
这样就可以减少内存碎片的问题,提高内存利用率。
非连续的物理内存的机制 - 分页和分段
分页机制有个重要的辅助结构,它就是页表:虚拟内存管理核心中的结构
分页存储管理将物理内存划分为固定大小的页面,虚拟地址空间也被划分为相同大小的页面,通过页表实现虚拟地址到物理地址的映射。
分段存储管理则将虚拟地址空间划分为多个不同大小的段,每个段都有一个段基址和一个长度。
我们下期来详细介绍分页和分段机制。
最后就是内核提供的物理内存管理的接口函数啦
首先当然是初始化:
memblock_init(): 该函数用于初始化物理内存块,即物理内存划分为可用的内存块。
然后当然是分配和释放内存:
memblock_free(): 该函数用于释放物理内存块。memblock_alloc(): 该函数用于分配物理内存块。
想分配内存之前当然要先查找有没有空闲:
memblock_find_in_range(): 该函数用于在指定的范围内查找空闲的物理内存块。
最后,如果需要内存保护,它也可以为物理内存“保驾护航”:
memblock_reserve(): 该函数用于保留物理内存块,使其不能被内存分配器分配。
5747

被折叠的 条评论
为什么被折叠?



