内存管理:内存分配器-percpu变量


percpu变量在内核中占有重要地位,它巧妙的避免了多核处理器在各core访问同一个数据结构时产生的竞争,省去了加锁(原子操作)和频繁的cache invalid动作,尤其是当这个数据结构会被core频繁访问的时候,能充分利用core本地的L1 cache提高访问速度,极大提升系统性能.

click here back to Homepage
click here back to Category
click here back to Linux Kernel

本文着重记录内核percpu的实现原理


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...

算法抽象

算法1 - TODO...
解决“TODO...的问题”
TODO...

参考文档

per-CPU变量
per-cpu分配
Linux内核同步机制之(二):Per-CPU变量

@2018-02-07 10:53
Comments
Write a Comment