per-CPU变量的核心思想是通过为操作系统中每个处理器都分配一个CPU特定的变量副本。这样做的好处是,在多处理器系统中,当处理器操作属于它的变量副本时,不需要考虑与其他处理器竞争的问题,同时该副本还可以充分利用处理器本地的硬件缓存以提高访问速度。例如在网络系统中,内核需要跟踪已经接收到的各类数据包的数量,让系统中每个处理器都使用属于自己的该变量的副本,这样在变量更新时就无需考虑多处理器的锁定问题,可以提高性能。如果需要统计出系统接收数据包的总量,只要将各处理器副本中的值相加即可。
1)静态per-CPU变量使用示例
#define DEFINE_PER_CPU(type, name) \
DEFINE_PER_CPU_SECTION(type, name, "")
#define get_cpu_var(var) \
(*({ \
preempt_disable(); \
this_cpu_ptr(&var); \
}))
#define put_cpu_var(var) \
do { \
(void)&(var);