linux slab,linux 内存管理
大家好,关于linux slab很多朋友都还不太明白,今天小编就来为大家分享关于linux 内存管理的知识,希望对各位有所帮助!
Linux内核:内存管理——Slab分配器
深入解析Linux内核:内存管理的艺术——SLAB分配器
在Linux内核的世界里,内存管理是一项至关重要的任务。其中,SLAB分配器扮演着关键角色,它解决了页框分配器的大页框浪费问题,通过专用SLAB(如TCP)和普通SLAB(如kmalloc-8, kmalloc-16等)实现了高效而灵活的内存管理。通过执行`cat/proc/slabinfo`,我们可以窥探SLAB的运行状态。
SLAB的核心理念在于对象大小的固定性,这有助于减少内存碎片,提高内存使用效率。kmem_cache(SLAB缓存)是其最高层级的数据结构,它负责描述和管理SLAB及其对象。内核模块通过kmem_cache_create定制化的SLAB,确保内存管理的灵活性。
kmem_cache结构内部,对象大小(object_size)与SLAB的全局配置如gfporder和num保持同步。每个NUMA节点的SLAB管理由struct kmem_cache_node数组负责,它支持分布式内存管理,确保了内存的均衡分配。
在kmem_cache的内部结构中,SLAB链表是关键部分,包括slabs_partial、slabs_full和slabs_free。slabs_partial存储部分使用的SLAB描述符,slabs_full则是所有对象的链表,而slabs_free则记录空闲的SLAB。这些链表通过spinlock_t lock进行同步,确保了在分配和回收过程中的线程安全。
SLAB设计巧妙,如SLUB(Simple Low Overhead Buffering)和SLOB(Simplified Low Overhead Buffering)结构,它们结合了计数器、活跃对象和动态链表,以实现内存的高效分配。SLAB描述符还包括页标志、对象地址指针和空闲对象链表,这些细节都在CONFIG_SLUB配置中有所体现。
SLAB描述符中的freelist和填充区域的优化,以及对象地址的着色设计,都是提高内存利用率的重要手段。内存着色通过添加偏移量避免同一行内存冲突,提升了性能。本地CPU和共享链表的组合,形成了SLAB分配器的高效运作框架,优先级分配原则保证了快速响应。
了解这些细节后,我们发现SLAB分配器是Linux内核内存管理的精髓所在,它在内存分配和回收的过程中,巧妙地平衡了效率与灵活性。通过深入研究这些内部机制,我们可以更好地理解和优化我们的系统内存使用。
【推荐阅读】
1. Linux文件系统详解
2. Linux进程管理:实时调度
3. Linux内核内存管理-缺页异常& brk系统调用
原文作者:tolimit
原文地址:linux内存源码分析- SLAB分配器概述
---
经过上述的精炼与重构,文章内容更加清晰,突出了SLAB分配器在Linux内核内存管理中的核心作用和关键细节,为读者提供了深入理解内存管理的窗口。
linux中的 slab/slob/slub 都是些什么
很久很久以前:一个叫做Mark Hemment的哥儿们写了Slab。在接下来的一些年里,其他人对Slab进行了完善。一年半以前,SLOB问世了。SLOB的目标是针对嵌入式系统的,主要是适用于那些内存非常有限的系统,比如32MB以下的内存,它不太注重large smp系统,虽然最近在这方面有一些小的改进。几个月之前,SLUB闪亮登场。它基本上属于对Slab的重设计(redesign),但是代码更少,并且能更好的适应large NUMA系统。SLUB被很认为是Slab和Slob的取代者,大概在2.6.24/2.6.25将会被同志们抛弃。而SLUB将是未来Linux Kernel中的首选。
Linux内核真是变化太快了,内存管理这块就是一个好例子。
本来Linux内核只有Slab的,现在好了,Slab多了两个兄弟:Slob和Slub。瞧!这就是内核的命名风格,让你光看名字就糊涂了!这也是我这两天读内核源代码的深刻体会,什么cache啊,cache_cache啊,free_area啊,绕不晕你才怪呢~!
以前搞不懂这三个到底什么关系,为什么要有这三个。今天搜了一下,明白了一些。简单的说:Slab是基础,是最早从Sun OS那引进的;Slub是在Slab上进行的改进,在大型机上表现出色(不知道在普通PC上如何),据说还被IA-64作为默认;而Slob是针对小型系统设计的,当然了,主要是嵌入式。相关文章如下:
Anatomy of the Linux slab allocator
The SLUB allocator
The SLOB allocator
这也正好体现了一个Linux内核开发一贯的思想:提供一种机制,而不是一种策略(Provide mechanism not policy)。
【Linux】Linux内核空间的slab分配模式
在Linux内核运行时,为高效管理动态内存,特别是在3G到3G+high_memory的内核空间中存放大量结构类型数据时,传统的页框分配方式会产生大量碎片。为解决这一问题,Linux从2.2版本开始引入了slab分配模式,它以更小的内存分配粒度,减少内外部碎片。
slab模式的核心是将内存块(slab)分割为存储同一类型数据的区域,通过对象大小定义分配,减少内部碎片。这种设计还考虑到了初始化操作的效率,因为slab可以缓存对象,避免频繁创建和撤销时的CPU开销。Linux的缓冲区由多个slab组成,管理方式包括链表结构,状态包括满、空、部分。
slab分配器通过对象类别管理内存,当需要对象时,从相应slab分配,释放时归还给该类别。Linux中的slab缓存分配器优化了小对象分配,支持对象初始化,并考虑硬件缓存对齐。但同时,slab管理涉及复杂的队列和存储开销,回收和调试较为复杂。
slab有专用和通用两种缓冲区类型,专用缓冲区用于频繁使用的内核数据结构,如task_struct,而通用缓冲区适用于初始化工作量较小的数据结构,如kmalloc和kfree函数。
总的来说,slab是Linux内存管理中的一种重要策略,它通过高效利用内存空间和减少碎片,提高了内核的性能。理解slab机制有助于深入内核空间的内存管理。