linux为什么要采用slab分配机制

如题所述

采用伙伴算法分配内存时,每次至少分配一个页面。但当请求分配的内存大小为几十个字节或几百个字节时应该如何处理?如何在一个页面中分配小的内存区,小内存区的分配所产生的内碎片又如何解决?
Linux2.0采用的解决办法是建立了13个空闲区链表,它们的大小从32字节到132056字节。从Linux2.2开始,MM的开发者采用了一种叫做slab的分配模式,该模式早在1994年就被开发出来,用于Sun Microsystem Solaris 2.4操作系统中。Slab的提出主要是基于以下考虑:
· 内核对内存区的分配取决于所存放数据的类型。例如,当给用户态进程分配页面时,内核调用get_free_page()函数,并用0填充这个页面。 而给内核的数据结构分配页面时,事情没有这么简单,例如,要对数据结构所在的内存进行初始化、在不用时要收回它们所占用的内存。因此,Slab中引入了对象这个概念,所谓对象就是存放一组数据结构的内存区,其方法就是构造或析构函数,构造函数用于初始化数据结构所在的内存区,而析构函数收回相应的内存区。但为了便于理解,你也可以把对象直接看作内核的数据结构。为了避免重复初始化对象,Slab分配模式并不丢弃已分配的对象,而是释放但把它们依然保留在内存中。当以后又要请求分配同一对象时,就可以从内存获取而不用进行初始化,这是在Solaris 中引入Slab的基本思想。
实际上,Linux中对Slab分配模式有所改进,它对内存区的处理并不需要进行初始化或回收。出于效率的考虑,Linux并不调用对象的构造或析构函数,而是把指向这两个函数的指针都置为空。Linux中引入Slab的主要目的是为了减少对伙伴算法的调用次数。
· 实际上,内核经常反复使用某一内存区。例如,只要内核创建一个新的进程,就要为该进程相关的数据结构(task_struct、打开文件对象等)分配内存区。当进程结束时,收回这些内存区。因为进程的创建和撤销非常频繁,因此,Linux的早期版本把大量的时间花费在反复分配或回收这些内存区上。从Linux2.2开始,把那些频繁使用的页面保存在高速缓存中并重新使用。
· 可以根据对内存区的使用频率来对它分类。对于预期频繁使用的内存区,可以创建一组特定大小的专用缓冲区进行处理,以避免内碎片的产生。对于较少使用的内存区,可以创建一组通用缓冲区(如Linux2.0中所使用的2的幂次方)来处理,即使这种处理模式产生碎片,也对整个系统的性能影响不大。
· 硬件高速缓存的使用,又为尽量减少对伙伴算法的调用提供了另一个理由,因为对伙伴算法的每次调用都会“弄脏”硬件高速缓存,因此,这就增加了对内存的平均访问次数。
Slab分配模式把对象分组放进缓冲区(尽管英文中使用了Cache这个词,但实际上指的是内存中的区域,而不是指硬件高速缓存)。因为缓冲区的组织和管理与硬件高速缓存的命中率密切相关,因此,Slab缓冲区并非由各个对象直接构成,而是由一连串的“大块(Slab)”构成,而每个大块中则包含了若干个同种类型的对象,这些对象或已被分配,或空闲,如图6.12所示。一般而言,对象分两种,一种是大对象,一种是小对象。所谓小对象,是指在一个页面中可以容纳下好几个对象的那种。例如,一个inode结构大约占300多个字节,因此,一个页面中可以容纳8个以上的inode结构,因此,inode结构就为小对象。Linux内核中把小于512字节的对象叫做小对象。
温馨提示:内容为网友见解,仅供参考
无其他回答

slabslab分配器
Slab是Linux操作系统中的一种内存分配机制,旨在满足系统中对内存动态分配的需求。在Linux的内存管理中,Slab层起着关键作用,它作为通用数据结构的缓存层,有效地应对了各种对象大小不一的挑战。对于大多数的数据结构来说,每个Slab层仅需一个页即可满足其内存需求。这种设计使得Slab在内存分配效率上表现出色...

Linux内核:内存管理——slab分配器
通过Slab分配器的优化,Linux内核在内存管理上实现了更高效、更灵活的内存分配策略,提升了系统的整体性能。Slab分配器的引入,不仅减少了内存分配的时间开销,还有效避免了内部碎片的产生,使得内存资源得到了更合理的利用。

linux为什么要采用slab分配机制
为了避免重复初始化对象,Slab分配模式并不丢弃已分配的对象,而是释放但把它们依然保留在内存中。当以后又要请求分配同一对象时,就可以从内存获取而不用进行初始化,这是在Solaris 中引入Slab的基本思想。实际上,Linux中对Slab分配模式有所改进,它对内存区的处理并不需要进行初始化或回收。出于效率的考...

【Linux】Linux内核空间的slab分配模式
总的来说,slab是Linux内存管理中的一种重要策略,它通过高效利用内存空间和减少碎片,提高了内核的性能。理解slab机制有助于深入内核空间的内存管理。

再谈slab
引入slab分配器的初衷是为了优化Linux内存管理,解决内存碎片问题,特别是内部碎片问题。Linux内存通常以页为单位管理,buddy算法则以2的n次方大小进行分配,最小单位为一页(4KB),最大可达4MB。然而,对于频繁需要分配或释放,且大小小于4KB的数据结构,如task_struct和mm_struct,页级分配显得过于粗粒度...

Linux内核:内存管理——Slab分配器
了解这些细节后,我们发现SLAB分配器是Linux内核内存管理的精髓所在,它在内存分配和回收的过程中,巧妙地平衡了效率与灵活性。通过深入研究这些内部机制,我们可以更好地理解和优化我们的系统内存使用。【推荐阅读】1. Linux文件系统详解 2. Linux进程管理:实时调度 3. Linux内核内存管理 - 缺页异常 & ...

Linux中的内存分配--slab(1)
在Linux中,当内存分配遇到小于一页的需求时,为避免浪费和内碎片问题,slab分配器应运而生。slab分配器的核心机制是kmem_cache,它为每个对象类别维护一个"cache",分配和释放对象时都从对应的cache中进行,提高了效率。cache的内存来源于buddy伙伴系统,通过分页并按照对象大小划分,确保物理内存的连续性...

Linux三大分配器之浅析slab基本原理
Linux内核中的内存分配管理涉及到Buddy和SLAB两种机制。Buddy分配器虽提供了page级别的接口,但颗粒度依然偏大,因此需要SLAB来进一步细化管理。SLAB分配器主要分为slab、slub和slob,其中slob适用于内存紧张的嵌入式系统,而slab因其效率和通用性,是Linux内核中的核心部分。SLAB的管理涉及两个关键结构:kmem_...

一文带你玩转Linux内存管理中的slab分配器!(含视频解析)
slab分配器是Linux内核中不可或缺的一部分,它以高效和智能的特性优化内存管理。首先,理解其基本原理至关重要,slab分配器通过预分配小块内存(slabs)来减少内存碎片,提高内存使用效率。这种设计允许快速且精确地分配和释放内存块,对系统性能有着显著提升。slab分配器的结构设计巧妙,它将内存分为多个...

Linux内存:块分配器slab、slob和slub
Linux内核的内存管理机制经过了长时间的发展与优化,其中Slab、Slob和Slub是三种关键的块分配器,它们各自针对不同场景进行了优化。Slab是最早的内存分配器,基于Sun OS的内存管理思想,用于缓存频繁使用的内核对象,以减少对象初始化时间。Slob则针对嵌入式系统设计,适用于内存有限的环境,特别是32MB以下的...

相似回答