Linux虚拟存储的核心思想是通过内存管理机制将物理内存与磁盘空间结合,为进程提供远大于实际物理内存的连续地址空间。其设计目标在于提升系统资源利用率、拓展内存容量以及保证进程隔离性,主要技术实现包含以下要点:
1. 分页机制与页表映射
- 采用分页式内存管理,将虚拟地址空间划分为固定大小的页(通常4KB)。通过多级页表实现虚拟地址到物理地址的动态映射,MMU(内存管理单元)负责实时转换。当CPU访问虚拟地址时,若页表项标记为无效则触发缺页异常。
2. 按需调页(Demand Paging)
- 进程的代码和数据最初仅保留在磁盘(如交换分区或文件系统),物理页帧在首次访问时通过缺页中断动态加载。这种懒加载策略显著降低进程启动时的内存开销,允许更多进程并发运行。
3. 页面置换算法
- 当物理内存不足时,内核通过页面置换算法(如LRU、CLOCK)选择牺牲页,脏页写回磁盘后回收帧。Linux采用复合策略,结合活跃链表与非活跃链表进行页面回收,并通过kswapd守护进程异步处理内存压力。
4. 交换空间(Swap)
- 将磁盘分区或文件作为内存扩展,置换出的页面存储于此。现代Linux支持zswap技术,先压缩页面再存入内存缓解磁盘I/O瓶颈。交换空间大小通常建议为物理内存的1-2倍。
5. 写时复制(Copy-on-Write)
- 父子进程共享物理页,仅当任一进程尝试写入时才复制页面。此技术大幅优化fork()性能,减少进程创建时的内存拷贝开销。
6. 内存映射文件(mmap)
- 将文件直接映射到进程地址空间,文件I/O转化为内存访问。既可用于加载动态库(如.so文件),也能实现进程间高效共享内存(MAP_SHARED模式)。
7. Overcommit策略
- Linux允许超量分配虚拟内存(由vm.overcommit_memory参数控制),基于概率统计应对稀疏内存使用场景。OOM Killer会在物理耗尽时选择性终止进程。
扩展知识点:
透明大页(THP):自动合并常规页为2MB大页,减少TLB缺失。
NUMA感知:多处理器架构下优化本地内存访问,避免跨节点延迟。
内存压缩:zram等技术在内存内压缩数据,减少交换I/O。
cgroups限制:通过memory子系统限制进程组的内存用量,防止单一进程耗尽资源。
虚拟存储的代价在于地址转换开销(需TLB加速)和缺页延迟,现代处理器通过ASID、PCID等硬件特性优化上下文切换性能。此外,嵌入式Linux可能禁用交换空间以保障实时性。