内存管理是内核中最复杂同时也是最重要的一部分。
内存管理的实现涵盖许多领域:

  • 内存中的物理内存页的管理
  • 分配大块内存的伙伴系统
  • 分配较小块内存的slab、slub、slob分配器
  • 分配非连续内存块vmalloc机制
  • 进程的地址空间

Linux内核一般将处理器的虚拟地址空间划分为两个部分。底部较大的部分用于用户进程,顶部则专用于内核。在上下文切换期间会改变下半部分,但总的空间是不变的。

管理物理内存的方式

  1. UMA 计算机(一致内存访问,uniform memory access) 将可用内存以连续方式组织起来,可能存在部分小的缺口。
  2. NUMA 计算机(非一致内存访问,non-uniform memory access) 总是多处理计算机。各个处理器之间通过总线连接起来,以支持不同CPU的本地内存之间相互访问。

1222.png

(N)UMA 模型中的内存组织

首先,将内存划分为节点。每个节点关联到系统中的一个处理器。各个结点又进一步细分为内存域。页帧代表系统内存的最小单位,系统的内存会分解为大量的页。

启动过程期间的内存管理

内核有一个最先适配(first-fit)分配器用于在启动阶段管理内存。该分配器使用一个位图来管理页。位图比特位的数目与系统中的物理内存页的数目相同。1表示页已用。0表示空闲页。

内核中的内存管理

  1. 内核分配函数:

    • kmalloc(size,flag): 分配size字节的内存区域,并返回void*指针
    • kfree(*ptr): 释放一个内存
  2. slab分配的原理
    由一个紧密的内存结构网络组成,由多个缓存结果组成,缓存结构执行一个数组,数组大小与CPU数目相同。每个元素都是一个阵阵只想未适用的对象。

在分配和释放对象时,采用后进先出原理。

Last modification:July 22, 2022
If you think my article is useful to you, please feel free to appreciate