Linux内存管理中的slab分配器
Linux内核中基于伙伴算法实现的分区页框分配器适合大块内存的请求,它所分配的内存区是以页框为基本单位的。对于内核中小块连续内存的请求,比如说几个字节或者几百个字节,如果依然分配一个页框来来满足该请求,那么这很明显就是一种浪费,即产生内部碎片(internal fragmentation)
为了解决小块内存的分配,Linux内核基于Solaris 2.4中的slab分配算法实现了自己的slab分配器。除此之外,slab分配器另一个主要功能是作为一个高速缓存,它用来存储内核中那些经常分配并释放的对象。
1.slab分配器的基本原理
slab分配器中用到了对象这个概念,所谓对象就是内核中的数据结构以及对该数据结构进行创建和撤销的操作。它的基本思想是将内核中经常使用的对象放到高速缓存中,并且由系统保持为初始的可利用状态。比如进程描述符,内核中会频繁对此数据进行申请和释放。当一个新进程创建时,内核会直接从slab分配器的高速缓存中获取一个已经初始化了的对象;当进程结束时,该结构所占的页框并不会被释放,而是重新返回slab分配器中。如果没有基于对象的slab分配器,内核将花费更多的事件去分配、初始化以及释放一个对象。
slab分配器有以下三个基本目标:
1.减少伙伴算法在分配小块连续内存时所产生的内部碎片;
2.将频繁使用的对象缓存起来,减少分配、初始化和释放对象的事件开销。
3.通过着色技术调整对象以更好地使用硬件高速缓存;
2.slab分配器的结构
slab分配器为每种对象分配一个高速缓存,这个缓存可以看做是同类型对象的一种储备。每个高速缓存所占的内存区又被划分多个slab,每个slab是由一个或多个连续的页框组成。每个页框中包含若干个对象,既有已经分配的对象,也包含空闲的对象。slab分配器的大致组成图如下:
每个高速缓存通过kmem_cache结构来描述,这个结构中包含了对当前高速缓存各种属性信息的描述。所有的高速缓存通过双链表组织在一起,形成高速缓存链表cache_chain。每个kmem_cache结构中并不包含对具体slab的描述,而是通过kmem_list3结构组织各个slab。该结构的定义如下:
struct kmem_list3 {struct list_head slabs_partial;struct list_head slabs_full;struct list_head slabs_free;unsigned long free_objects;unsigned int free_limit;unsigned int colour_next;spinlock_t list_lock;struct array_cache *shared;struct array_cache **alien;unsigned long next_reap;int free_touched;
};
可以看到,该结构将当前缓存中的所有slab分为三个集合: 空闲对象的slab链表slabs_free,非空闲对象的slab链表slabs_full以及部分空闲对象的slab链表slabs_partial。每个slab有相应的slab描述符,即slab结构,它的定义如下:
struct slab {struct list_head list;unsigned long colouroff;void *s_mem;unsigned int inuse;kmem_bufctl_t free;unsigned short nodeid;
};
slab描述符中的list字段标明了当前slab处于slab处于三个slab链表的其中一个。我们将上述的slab分配器进行细化,可以得到下面的结构图:
3.高速缓存的分类
slab高速缓存分为两大类,普通高速缓存和专用高速缓存。普通高速缓存并不针对内核中特定的对象,它首先会为kmem_cache结构本身提供高速缓存,这类缓存保存在cache_cache变量中,该变量即代表的是cache_chain链表中的第一个元素;另一方面,它为内核提供了一种通用高速缓存。专用高速缓存是根据内核所需,通过制定具体的对象而创建。
3.1 普通高速缓存
slab分配器中kmem_cache是用来描述高速缓存的结构,因此它本身也需要slab分配器对其进行高速缓存。cache_cache变量保存着对高速缓存描述符的高速缓存。
static struct kmem_cache cache_cache = {.batchcount = 1,.limit = BOOT_CPUCACHE_ENTRIES,.shared = 1,.buffer_size = sizeof(struct kmem_cache),.name = "kmem_cache",
};
slab分配器所提供的小块连续内存的分配是通过通用高速缓存实现的。通用高速缓存所提供的对象具有几何分布的大小,范围为32到131072字节。内核中提供了kmalloc()和kfree()两个接口分别进行内存的申请和释放。
3.2 专用高速缓存
内核为专用高速缓存的申请和释放提供了一套完整的接口,根据所传入的参数为具体的对象分配slab缓存。
高速缓存的申请和释放
kmem_cache_create()用于对一个指定的对象创建高速缓存。它从cache_cache普通高速缓存中为新的专有缓存分配一个高速缓存描述符,并把这个描述符插入到高速缓存描述符形成的cache_chain链表中。kmem_cache_destory()用于撤销一个高速缓存,并将它从cache_chain链表上删除。
slab的申请和释放
kmem_cache_alloc()在其参数所指定的高速缓存中分配一个slab。相反,kmem_cache_free()在其参数所指定的高速缓存中释放一个slab。
Linux内存管理中的slab分配器相关推荐
- 一文给你解决linux内存源码分析- SLUB分配器概述(超详细)
SLUB和SLAB的区别 首先为什么要说slub分配器,内核里小内存分配一共有三种,SLAB/SLUB/SLOB,slub分配器是slab分配器的进化版,而slob是一种精简的小内存分配算法,主要用于 ...
- 什么是Linux内存管理中的RSS和VSZ
本文翻译自:What is RSS and VSZ in Linux memory management What are RSS and VSZ in Linux memory management ...
- linux内存分配机制,Linux内存分配机制:SLAB / SLUB / SLOB
Linux内存分配机制:SLAB / SLUB / SLOB [日期:2011-07-15] 来源:Linux社区 作者:do2jiang [字体:大 中 小] slob: introduce the ...
- Linux内存管理第八章 -- Slab Allocator (二)
文章目录 Linux内存管理 -- Slab Allocator (二) Slabs Storing the Slab Descriptor Slab Creation Tracking Free O ...
- linux 内核修改rss,什么是Linux内存管理中的RSS和VSZ
RSS是驻留集大小,用于显示分配给该进程的内存量,并且位于RAM中.它不包括换出的内存.它确实包括来自共享库的内存,只要这些库中的页面实际上在内存中.它确实包括所有堆栈和堆内存. VSZ是虚拟内存大小 ...
- 宋宝华:关于linux内存管理中DMA ZONE和dma_alloc_coherent若干误解的澄清
本文已首先在Linuxer公众号(ID: LinuxDev)发表,先转回我的blog也发表.转载请注明出处. 1.DMA ZONE的大小是16MB? 这个答案在32位X86计算机的条件下是成立的,但是 ...
- Linux 内存管理 | 物理内存管理:物理内存、内存碎片、伙伴系统、slab分配器
文章目录 物理内存 物理内存分配 内存碎片 外部碎片 内部碎片 伙伴系统(buddy system) slab分配器 本文举例为32位Linux 物理内存 在Linux中,内核将物理内存划分为三个区域 ...
- Linux 内存管理 | 物理内存、内存碎片、伙伴系统、SLAB分配器
文章目录 物理内存 物理内存分配 外部碎片 内部碎片 伙伴系统(buddy system) slab分配器 物理内存 在Linux中,内核将物理内存划分为三个区域. 在解释DMA内存区域之前解释一下什 ...
- Linux内存管理之高端内存映射
一:引子 我们在前面分析过,在linux内存管理中,内核使用3G->4G的地址空间,总共1G的大小.而且有一部份用来做非连续空间的物理映射(vmalloc).除掉这部份空间之外,只留下896M大 ...
最新文章
- windows7关闭计算机对话框,电脑弹出对话框很烦人怎么办?win7禁止对话框弹出的方法...
- java shell排序算法_【算法】8种排序算法(Java)
- ef 排序string转int_排序算法之基本排序算法
- 【模板引擎】Springboot整合ThymeleafThymeleaf基本语法
- 台湾国立大学郭彦甫Matlab教程笔记(22) Cramer's method(Inverse matrix逆矩阵法)
- ASP.NET CORE MVC 实现减号分隔(Kebab case)样式的 URL
- java之socket的OOBInline和UrgentData和发送心跳包研究
- LightOJ - 1245 Harmonic Number (II) 求同值区间的和
- Go语言【第九篇】:Go数据结构之:数组
- 计算机会计技术特点,会计电算化的特点
- C语言中register类型变量
- 局域网无法访问共享新方法
- 记账系统推荐金蝶精斗云_金蝶精斗云企业免费会计记账软件有哪几种?
- 中国地图流动图(一)
- border-shadow
- Revit各专业协同工作—链接与工作集
- php被挂马,PHP网站被挂马防御战
- endnote x9 word 闪退
- 《现代控制系统》第五章——反馈控制系统性能分析 5.3 二阶系统的性能
- WooCommerce——产品过滤器WooCommerce Products Filter
热门文章
- java并发之线程封闭(二)
- Effective Java之覆盖equal时要遵守通用约定(八)
- 07.es_thread_pool使用
- 最短工期 (25 分)【拓扑排序模板】
- 【已解决】The server time zone value ‘�й���ʱ��‘ is unrecognize
- 统一过程(UP)定义了初启阶段、精化阶段、构建阶段、移交阶段和产生阶段,每个阶段以达到某个里程碑时结束,其中()的里程碑是生命周期架构。 A.初启阶段 B.精化阶段 C.构建阶段 D.移交阶段
- oracle 换行符_python实现自动化报表(Oracle/plsql/Excel/多线程)
- clang编译c语言开o优化,针对gcc或clang的LTO可以跨C和C方法进行优化
- java对象如何保存日期_如何在Java中的日期对象中存储和检索毫秒?
- 基因表达式编程gep_基因表达式编程GEP— 前言