0%

Linux内存管理

内存分页

内存分页是Linux中的一种内存管理机制,内存被分为固定大小的块,称为页(page)。Linux中的页使用结构struct page来表示。

内存的分配

BUDDY算法

BUDDY算法的作用是减少存储空间中的空洞与碎片,增加利用率。其基本思想是把内存中的所有页面按照2的幂次方进行分块管理,分配的时候如果没有找到相应大小的块,就把大的块一分为二划分为两个小块;释放内存的时候,相邻的块又能够合成新的大块。

SLAB内存管理

BUDDY内存分配的时候,是以页块为基本单位来分配的。但是这种方法的缺点就是粒度比较大,而大多数的内核对象远小于页的大小,因此需要一种更加细粒度的方法来对内存进行管理。由此,Linux引入了SLAB层来进行更加细致的内存管理。

SLAB使用高速缓存来描述不同的内存对象,每种内存对象对应着一个高速缓存。SLAB按照对象的大小进行了分组,在分配的时候不会产生大的内存碎片,并且支持硬件缓存来提高TLB的性能。

为了方便管理,SLAB分为三种状态:full、partial和empty。full表示没有可用的内存对象,partial表示部分使用中,empty表示没有正在使用的内存对象。

SLUB与SLOB

SLUB保留了SLAB的基本思想,但是简化了SLAB中的一些结构,提升内存利用率。而SLOB是一个简化的内存分配器,主要适用于内存非常有限、处理简单的系统。

进程地址空间

内存映射

一个进程运行的时候,其用到文件的代码段、数据段等都是映射到内存地址区域的,这个功能是通过mmap()系统调用来实现的。mmap()将文件从偏移offset的位置开始的长度为length的一个块映射到内存区域中。

缺页错误

虚拟内存进行分配之后,并没有分配相应的物理页面。内核通过缺页错误进行处理,然后进行页表层的创建。