Linux内存管理机制 📅 2026/8/1 3:50:39 我们知道Linux内存管理是引入虚拟地址来管理物理地址的。Linux 为每个进程提供了一个独立的、连续的虚拟地址空间如 64 位系统下用户空间通常为 48 位/128TB 地址空间底层依靠MMU内存管理单元翻译成真实的物理 DDR 地址。1.为什么要引入虚拟地址管理内存1.1解决直接访问内存造成不安全1.2解决碎片化问题3.内存不足问题4.相同内容重复加载相同C库每个进程都会加载一份2.引入虚拟内存对于内存不足问题解决方案是磁盘交换空间问数据到磁盘了那岂不是访问速度很慢了答的确但我们实际上访问这块数据的时候还是要将磁盘上的数据转移到内存中所以这个慢不是应用层读取磁盘数据慢而是换入Swap In和换出Swap Out导致的。问既然慢为什么还要设计SWAP答① 预防崩溃“慢”总比“死机”强当你的物理内存比如 16GB全部用满时如果没有 Swap系统只能调用OOM KillerOut of Memory 随机挑选并强行杀死你的进程比如你的 C 编译任务或 IDE。有了 Swap系统虽然会变慢甚至卡顿但任务能够保全并继续运行。② 释放物理内存给真正的“热数据”系统中运行着大量的后台服务如 Linux 的systemd、各种守护进程它们在开机初始化后很多代码和数据可能几个小时甚至几天都不会再被访问一次。 操作系统把这些“冷数据”换出到 Swap 磁盘上就能把省出来的物理 DDR 空间留给频繁读写的“热数据”或者用来做磁盘文件缓存Page Cache反而提升了整机的整体性能。3. 物理内存分层与分配算法物理内存DDR在内核中被抽象为以4KB 为单位的物理页帧Page Frame并通过三级结构组织Node (NUMA)$\rightarrow$Zone$\rightarrow$Page。① 伙伴系统Buddy System—— 管理大块物理页解决痛点物理内存频繁申请/释放导致的外部碎片External Fragmentation。核心机制将所有空闲物理页按1 页、2 页、4 页 ... 1024 页分组挂载在空闲链表中。申请时若无对应大小的连续页则拆分更大尺寸的“伙伴”块。释放时自动检查相邻的“伙伴”块是否也空闲若是则互相合并成更大的连续块。② Slab / Slub 分配器 —— 管理小内核对象解决痛点Buddy System 最小分配单位是 4KB如果申请 32 字节的内核结构体如task_struct会造成严重的内部碎片Internal Fragmentation。核心机制向 Buddy System 申请一整页内存将其切分成固定大小的小对象Object池。释放时并不还给 Buddy而是留作下次直接复用类似于对象池技术。