Linux SLUB分配器详解
内核对象缓冲区管理 Linux 内核在运行过程中,常常会需要经常使用一些内核的数据结构(对象).例如,当进程的某个线程第一次打开一个文件的时候,内核需要为该文件分配一个称为 file 的数据结构;当该文件被最终关闭的时候,内核 我们可以看出,内核对象的管理与用户进程中的堆管理比较相似,核心问题均是:如何高效地管理内存空间, 内核使用的对象种类繁多,应该采用一种统一的高效管理方法. 内核对某些对象(如 task_struct)的使用是非常频繁的, 内核对象中相当一部分成员需要某些特殊的初始化(例如队列头部)而并非简单地清成全 0.如果能充分重用已被释放的对象 分配器对内核对象缓冲区的组织和管理 随着共享内存的多处理器系统的普及,多处理器同时分配某种类型对象的现象时常发生,因此分配器应该尽量避免处理器间同步的开销,应采用某种 Lock-Free 的算法. 如何有效地管理缓冲区空间,长期以来都是一个热门的研究课题.90 年代初期,在 Solaris 2.4 操作系统中,采用了一种称为“slab”(原意是大块的混凝土)的缓冲区分配和管理方法,在相当程度上满足了内核的特殊需求. -------------------------------------------------------------------------------- SLAB 分配器介绍 多年以来,Linux 内核使用一种称为 SLAB 的内核对象缓冲区分配器.SLAB 分配器源于 Solaris 2.4 的分配算法,工作于物理内存页框分配器之上,管理特定大小对象的缓存,进行快速而高效的内存分配. SLAB 分配器为每种使用的内核对象建立单独的缓冲区.Linux 内核已经采用了伙伴系统(Buddy System)管理物理内存页框,因此 SLAB 分配器直接工作于伙伴系统之上.每种缓冲区由多个 slab 组成,每个 slab就是一组连续的物理内存页框,被划分成了固定数目的对象.根据对象大小的不同,缺省情况下一个 slab 最多可以由 1024 个物理内存页框构成.出于对齐等其它方面的要求,slab 中分配给对象的内存可能大于用户要求的对象实际大小,这会造成一定的内存浪费. 内核使用 kmem_cache 数据结构管理缓冲区. |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |