linux 内存分配机制的理解

    今天又看了一下linux 内核slab分配器的内容,脑中产生了一个疑问: linux系统内核使用了buddy算法处理内存页的管理,使用slab分配器对小容量内存的分配,那么一个应用程序会经常使用到如malloc这样的内存请求,它是怎么工作的呢?

    原先我认为可能和这个slab分配器机制相关,或者使用了slab。但又一想,slab分配器有两种机制:普通高速缓存和专用高速缓存,即前者是系统启动时建立的,且每个slab都管理固定大小的空间(2的幂次为单位的字节数);后者slab分配大小可由开发定制,系统提供了接口。

    如果用户内存请求使用第一种slab分配,申请空间随机不可能那么凑巧是2的幂次。岂不是浪费内存?这种可能性可以否定。采用第二种方式,slab分配定制在内核态调用,且系统调用不会调用它的接口,所以也可以否定。第二种应该是提供给内核态程序的。

    想到这里,意识里slab是这样一种机制,它为申请固定大小内存的结构,且批量的频繁使用提供了便利,是内核和底层行为。

    那么用户态的内存请求是怎么工作的呢?那就要研究malloc系统调用了。其实是请求内存时内核去分配内存,比如要分配一个虚拟地址空间,要产生缺页请求,获取物理内存,并映射进页表,返回的虚拟地址供程序调用。释放内存时则标记此段虚拟地址空间为未使用,在适当的时候释放整个页。

    kmalloc调用使用了slab分配机制,vmalloc调用则是和malloc相似的分配机制,通过内核页表来请求内存。在页表或slab分配表中查询不到空闲空间则请页异常中断处理。

你可能感兴趣的:(linux 内存分配机制的理解)