1. 空闲链表
包括最佳适配、最先适配、最差适配
2. 内存池
一个池子里包含很多空闲链表,每条空闲链表的各个节点大小都是一样的,比如一条全是64KB,另一条全是16kb,分配时先选一条最接近的然后取一个节点分配给进程。
缩短了链表线性检索的时间,但对于内存的划分很重要
3. buddy系统(内存池的改进)
相比内存池,它允许相邻两个一样大的内存块合并,比如2个16KB的合成32KB,然后就挪到32KB的链表上。
减少了内存碎片(因为碎片可以合并),但限制所有内存的大小时2的幂,并且链表节点的移动也要额外开销。
4. slab(another改进)
buddy的最小单位是页,就是4KB,但slab系统可以做到更小单位的内存合并,比如128B。特点是相同大小的对象归为一类,比如7B归为一类,20B归为另一类,同类的对象从同一个cache中获取内存,一个cache切分成好几个slab,每个slab住一个对象。
没咋懂。。
用户空间申请内存:melloc
内核空间申请内存:kmalloc(),_ _get_free_pages(),vmalloc()
kmello
用于申请比较小的内存,在物理地址上是连续的
vmeloc
用于申请比较大的内存,在物理地址上是不连续的,开销比kmelloc更大
其他的一些概念:
page cache:内存中开辟一块区域用来缓存磁盘上的文件,可以减少磁盘io
anonymous page:有些区域建立的时候只有虚拟地址,在实际使用的时候才分配物理页面,这部分还没有具体分配的物理页面称为anonymous page
内存回收:刚刚回收了的页面又被分出去,就会造成浪费,所以选择不常使用的页面回收是需要研究的。page cache和anonymous page都是要回收的。
内存规整:内存还有空闲,但空闲部分都被切割成了小块不够分,就想办法把小块合成一个大块。(当然,大量page的迁移是开销很大的)
1142

被折叠的 条评论
为什么被折叠?



