内存管理:内存分配器-percpu变量
percpu变量在内核中占有重要地位,它巧妙的避免了多核处理器在各core访问同一个数据结构时产生的竞争,省去了加锁(原子操作)和频繁的cache invalid动作,尤其是当这个数据结构会被core频繁访问的时候,能充分利用core本地的L1 cache提高访问速度,极大提升系统性能.
SOURCE CODE TREE
/kernel/include/linux/percpu-defs.h : percpu基础定义,包含静态定义
/kernel/include/asm-generic/percpu.h : 包含以上,抽取的硬件平台通用实现,percpu基础读写接口封装
/kernel/arch/arm/include/asm/percpu.h : 包含以上,硬件平台特殊实现
/kernel/include/linux/percpu.h : 包含以上,动态申请和释放percpu变量,提供给其它模块调用接口
/kernel/include/linux/percpu_counter.h
/kernel/include/linux/percpu_ida.h
/kernel/include/linux/percpu-refcount.h
/kernel/include/linux/percpu-rwsem.h
/kernel/mm/percpu.c : percpu内存分配器的实现,文件中头部描述信息有详细说明
/kernel/mm/percpu-km.c : 提供基于kernel低端连续内存区域的分配器接口
/kernel/mm/percpu-vm.c : 提供基于kernel vmalloc高端内存区域的分配器接口
MECHANISM
基本思想
通过在链接器中增加.data..percpu段(位于__per_cpu_start和__per_cpu_end之间),配合percpu分配器实现,将多core可能同时访问的变量替换为每个core一副本的percpu变量形态. 各core访问各自的变量副本区域,互不干扰避免了竞争的产生,同时又充分利用core各自的L1 Cache提高性能.
Tips:
除了这个.data..percpu段以外,根据定义的属性不同percpu变量还有其它段
定义声明
TODO...
TODO...
流程图
TODO...
TODO...
TODO...
TODO...
API
TODO...
性能瓶颈
TODO...
算法抽象
解决“TODO...的问题”
TODO...
参考文档