linux内核的内存管理

内核内存管理总结

内核的内存分配不同于用户空间的内存分配,,balabala

内核里内存的分配主要有这么几种,首先是按页来请求内存,用alloc_pages()和它的几个兄弟函数可以实现,按页分配,即直接请求返回的是一个或者多个页框;而对于页框的管理,内存中不同页会被分为不同zones,区分标准是:比如DMA能直接操作的区域,HIGH memory区域(后面再讲),每个不同的区域分别让buddy system algorithm来接管分配,buddy system algorithm,即把页分为不同大小的block,每个block分别包含页数目,1,2,4直到1024;

使用这buddy system algorithm而不是普通的链表一样的管理是为了防止分页的外部碎片,而导致大的内存allocation请求却因内存的不连续即碎片原因而无法请求成功

而对于某些操作,4KB的页(64位是8KB)分配还是太大了,这些请求会另外用kalloc()来实现,kalloc会返回大于申请空间的物理上连续的内存,这种内存分配是最常见的,很明显kalloc也要解决外部碎片的问题,这里是通过slab layer中维护一个cache来实现的,cache中有malloc_size表,指向26个大小是32,64一直到131072大小的区域的相关结构(cache descriptor),它防止碎片的方法与buddy system algorithm几乎一样,这里可以想象一下如果不用slab layer来维护而是用free list会有什么坏处(当然是外部碎片啦)

而这里的slab layer其实不止这一种cache(要区分开CPU的高速缓存),slab layer还有其他cache是专门存储其他slab的,slab里有若干段连续的内存空间用来分配给固定object,这里就要引出另一种内存分配方式,是给那些大量创建删除的对象,很容易想到,文件系统的inode和进程的process descriptor都是这种类型的,这里的slab像是一个内存池,不会主动去释放里面的内存空间,而是像内存池一样,要用到再取出,这里取出的方式也有讲究,优先把没被用光的取出,没有再去找新的没用过的空间

最后再介绍一种vmalloc,这种是返回逻辑上连续的而物理空间不连续的空间,较为少用

 

TODO

  1. 内核分配的冷热区域

  2. uderstanding linux kernel323页末说的从buddy system的内部碎片free list会拿来干嘛用

参考资料

  1. understanding the linux kernel

  2. Linux Kernel Development

  3. https://zhidao.baidu.com/question/584699763711904325.html

  4. https://blog.csdn.net/bullbat/article/details/7194794

  5. 伙伴算法的实现

  6. slab

  7. https://www.cnblogs.com/longchang/p/10749402.html

TODO

  1. APUE的slab

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章