目前有很多讲slab的文章,要么是纯讲原理画一堆图结合源码不深导致理解困难,要么是纯代码注释导致理解更困难,我在猛攻了一周时间后,细致总结一下slab,争取从原理到源码都能细致的理解到并立刻达到清楚的使用 slab分配器是一种在Linux内核中用于高效管理小块内存的机制,它解决了伙伴系统在处理小内存分配时效率不高的问题。slab分配器将内存分成一系列的slabs,每个slab包含一组相同大小的对象,这些对象是预先分配好的,以便快速地分配和回收。slab的主要目标是减少内存碎片并提高小内存分配的性能。 **一、slab分配器的工作原理** 1. **内存分档**:slab分配器根据对象的大小将其划分到不同的档次,例如,100字节的请求可能会映射到128字节的slab单元。这样做是因为分配和释放小块内存的开销比分配大块内存更高,而slab通过批量处理可以减少这种开销。 2. **内存预分配**:slab分配器在内存中预先分配一组连续的内存块,这些块称为slabs,并且每个slab内部包含多个对象(如128字节的单元)。当需要分配内存时,slab分配器可以直接从已分配的slab中取出一个未使用的对象,而无需每次都从底层的伙伴系统中获取新页面。 3. **缓存管理**:slab分配器维护了一个高速缓存(kmem_cache)结构,其中包含了各种大小的slab信息。当需要分配特定大小的对象时,会根据对象大小找到对应的高速缓存,然后从该高速缓存中分配内存。 4. **内存回收**:释放内存时,并不直接返回给伙伴系统,而是将其放回对应的slab,以便后续的分配请求能快速重用。这种方法提高了效率,因为释放的内存通常很快会被再次使用,减少了系统调用的次数。 **二、slab分配器的创建与使用** 1. **创建slab**:当内核需要为特定大小的对象分配内存时,首先会通过`kmalloc`函数进行。`kmalloc`会查找合适的`kmem_cache`,这个过程由`__find_general_cachep`函数完成,它遍历`cache_sizes`结构,找到适合请求大小的slab缓存。 2. **分配内存**:找到合适的`kmem_cache`后,`kmalloc`会调用`__cache_alloc`来实际分配内存。`__cache_alloc`会从对应的slab中找到未使用的对象并返回。 3. **释放内存**:释放内存时,`kfree`函数会将内存对象放回到其所属的slab,使其可被再次分配,而不是立即归还给伙伴系统。 **三、slab和kmalloc的关系** kmalloc是内核中用于动态分配内存的接口,它依赖于slab分配器来实现对小内存块的有效管理。`kmalloc`接受内存大小和内存分配标志作为参数,然后通过`__find_general_cachep`找到合适的`kmem_cache`,最后通过`__cache_alloc`从对应的slab中获取内存。 slab分配器是Linux内核中处理小内存分配的关键组件,它通过预分配和缓存机制提高了内存管理的效率,而`kmalloc`作为接口,使得用户能够方便地利用slab分配器进行内存操作。通过深入理解和使用slab,可以更好地优化内核内存管理,减少内存碎片,提高系统的整体性能。
剩余38页未读,继续阅读
- Sarah_cg2022-03-25还不错,值
- 粉丝: 240
- 资源: 12
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助