虚拟内存空间
终于又要开新的一章了,这次我们来聊聊内存相关但又相对独立的一块 -- 虚拟内存空间。
从我现在的角度去看,内核中的内存管理可以分成两个重要的部分:
物理内存分配回收
虚拟内存空间管理
其中第一部分在自底而上话内存一章中做了描述,第二部分将在这章展开。
其实这两部分并不是完全分割的,而是你中有我,我中有你。只是在一定层次上看,第一部分的内容已经相对完整可以自成一个体系了。
虽然在本章中将紧密得引用第一部分的内容,尤其是struct page,但是我们还是可以尽量将本章分成一下几个部分来描述。
页表
vma
反向映射
THP
页表
可以说虚拟内存空间的物理根本就是页表了,所以开篇的头一个小节我们来看看页表的样子,以及页表构造和释放的过程。
vma
除了有硬件上的页表做虚拟空间的映射,在软件上也有对应的数据结构来区分虚拟地址空间的属性,而这个数据结构就是:
PS: 在引入maple tree之前的版本
反向映射
反向映射是用来搜索对于某一个内存页,都有哪些进程在使用。其中分成了匿名页和文件页。
反向映射的架构也是经历了一番周折才定型为现在的样子。首先我们来说说匿名反向映射的前世今生
了解了历史后,我们深入学习一下现状 图解匿名反向映射
看了上文后,大家一定对反向映射有了概念性的认识。但是你一定想不到在学习反向映射的过程中有一个非常繁琐的内容 -- mapcount。
从概念上看这个值的含义是表示当前页映射到页表的个数,案例是比较好理解的。但是当这个数遇到了透明大页(THP)后就产生了各种纠缠不清的恩恩怨怨。在THP和mapcount之间的恩恩怨怨文章中,我将给大家尝试理清楚这中间的是是非非。
THP
透明大页(THP)是一种能够加速页表查询的方法。很有意思,在这里简要说一下我的理解。
NUMA策略
当系统中存在多个numa节点时,内存从哪个numa节点上分配就变得有些重要了。因为这会影响到系统运行的性能。
内核中为了应对这个问题,提出了NUMA策略
同时为了保持进程迁移过程中内存策略的一致,内核还提供了numa balance。
Last updated