Linux中内存管理详解

💡 原文中文,约4500字,阅读约需11分钟。
📝

内容提要

Linux系统的内存管理涉及物理内存的组织和管理,包括内存的分配和回收。虚拟内存地址防止用户进程干扰内核和其他进程的内存。物理内存分为Page、Zone和Node,内存分配分为大内存和小内存分配。虚拟地址通过页表转化为物理地址,TLB用于加速虚拟地址和物理地址的映射。虚拟内存可以运行更大内存的程序,但速度较慢。

🔎

延伸解读

虚拟地址如何隔离进程与内核

文章指出,如果用户进程直接操作物理地址,可能篡改内核内存或干扰其他进程。Linux 通过为每个进程分配独立的逻辑地址空间,并建立逻辑地址到物理地址的映射,实现了内存隔离。这样,进程只能访问自己的地址空间,无法直接触碰内核或其他进程的内存,从而保障了系统的稳定性和安全性。

物理内存的分级管理:Page、Zone 与 Node

Linux 将物理内存划分为 Page、Zone 和 Node 三个层级。Page 是基本单位,大小 4K;Zone 管理多个 Page,分为 ZONE_DMA、ZONE_NORMAL 和 ZONE_HIGHMEM,分别服务于 DMA、内核和用户数据;Node 对应 CPU,每个 Node 包含多个 Zone。这种结构便于针对不同用途和硬件特性进行精细化管理。

大内存与小内存的分配策略

针对不同大小的内存请求,Linux 采用不同的分配器。大内存使用伙伴系统,将 Page 分组为 1、2、4 直到 1024 个页的块,通过链表管理,分配时若没有合适块则向上查找并分裂。小内存则使用 slub 分配器,将几个页作为缓存,内部维护链表,分配和释放都在链表中操作,无需清空,提升了小对象分配效率。

虚拟内存的代价与权衡

虚拟内存通过 swap 分区将硬盘空间作为内存的扩展,使得程序可以运行在比实际物理内存更大的空间中。但文章强调,虚拟内存需要在内存在磁盘间频繁换入换出,这是一个耗时的操作,因此速度比直接使用物理内存慢。这提醒我们,虚拟内存虽然扩展了容量,但性能上存在折衷。

❓

Q&A

Linux的内存管理是如何组织和管理物理内存的?

Linux的内存管理通过分配和回收物理内存来组织内存,物理内存分为Page、Zone和Node三个层级。

虚拟内存在Linux中有什么作用?

虚拟内存通过映射虚拟地址到物理内存,防止用户进程干扰内核和其他进程的内存,允许运行更大内存的程序。

Linux中物理内存的分配方式有哪些?

物理内存的分配分为大内存和小内存,大内存使用伙伴系统,小内存使用slub分配。

如何将虚拟地址转换为物理地址?

虚拟地址通过页表转化为物理地址,每个进程都有一个页表,内核共享一个页表。

TLB在Linux内存管理中起什么作用?

TLB是一个缓存,用于加速虚拟地址和物理地址的映射,提高查询效率。

用户进程如何访问内存?

用户进程只能操作用户空间的物理内存和虚拟空间,无法直接访问内核空间。

🏷️

标签

➡️

继续阅读