slab,slub,slob分配器
时间: 2024-06-02 11:06:31 浏览: 165
slab、slub、slob是Linux内核中常用的内存分配器。
slab分配器是一种基于slab缓存的内存分配器。它将内核中常用的数据结构和对象分成若干个大小相等的slab缓存,每个slab缓存对应一种大小的数据结构或对象。当需要分配内存时,就从相应大小的slab缓存中获取一块空闲内存,当不需要使用时,就将其释放到相应大小的slab缓存中。
slub分配器是一种基于slab缓存的内存分配器,是对slab分配器的改进。它采用了更加高效的算法,提高了内存分配的性能和效率。
slob分配器则是一种轻量级的内存分配器,它不依赖于任何数据结构或对象,也没有预先分配的缓存。它将空闲内存块按照大小排序,并将其组织成链表。当需要分配内存时,就从相应大小的链表中获取一块空闲内存,当不需要使用时,就将其释放到相应大小的链表中。
相关问题
linux的slub算法原理,图解slub
Slub(SLOB的升级版)是Linux内核中的一种内存分配算法,Slub是一种基于伙伴系统技术的内存分配器,也是一种快速高效的内存分配器。
Slub通过三个链表来管理空闲对象,它们是slab链表、partial链表和full链表。
Slab链表存储着所有的slab,每个slab是一个内存页,用于存储相同大小的对象。Slab链表中的每个slab都被分成了若干个大小相同的空闲对象,每个空闲对象都有一个管理结构体,其中包含了指向下一个空闲对象的指针。当空闲对象被分配出去时,指向它的指针会被清空。
Partial链表存储着部分被使用的slab,这些slab中的一些空闲对象已经被分配出去,但还剩余一些空闲对象。
Full链表存储着所有已经被使用完的slab,这些slab中已经没有可用的空闲对象。
当需要分配一个对象时,Slub会先查找Partial链表,如果找到了一个有空闲对象的slab,就从该slab中分配一个空闲对象出去。如果Partial链表中没有找到可用的slab,则从Slab链表中获取一个新的slab,并从中分配一个空闲对象出去。如果Slab链表中也没有可用的slab,则从Full链表中找到一个已经使用完的slab,将其中所有的对象都移动到Slab链表中,并从其中分配一个空闲对象出去。
当一个对象被释放时,Slub会将它的管理结构体中的指针保存下来,然后将该对象加入到slab的空闲对象链表中,如果该slab的空闲对象链表已满,则将该slab从Partial链表中移动到Full链表中。
总的来说,Slub算法通过预先分配内存页的方式来提高内存分配的效率,同时通过三个链表来管理内存的分配和回收,从而保证了内存的高效使用。
Linux中的内存分配器
在Linux中,有多种内存分配器可用,其中最常见的是SLAB和SLUB。SLAB是早期版本的内存分配器,在Linux 2.6.23之前是默认分配器。SLAB的设计目标是提供一种快速而高效的内存分配器,适用于大多数情况下的对象分配。
SLUB是一种更现代的内存分配器,它在Linux 2.6.23中引入,从Linux 2.6.27开始成为默认分配器。SLUB设计的目标是更快的内存分配和更低的内存消耗,尤其是在多核系统上。
另外,还有一些其他的内存分配器可供选择,例如SLOB和Hoard。SLOB是一种非常小的内存分配器,适用于嵌入式系统和小型设备。Hoard是一种用于多核系统的高效内存分配器,它使用了一些先进的技术来提高并发性和扩展性。
选择哪种内存分配器取决于应用程序的需求和系统的特定情况。通常情况下,SLUB是最好的选择,因为它在多核系统上表现出色并且更高效。
阅读全文