DEFINE_PER_CPU(int, per_cpu_test) = 0x12345678;
//定义一个静态的全局 每cpu变量 per_cpu_test用于测试
static void test_per_cpu_var( void )
{
int cpu_id;
int rc = 0x00;
cpu_id = 0x00;
int *ptr;
while (cpu_id < nr_cpu_ids){
if (cpu_online(cpu_id)) {
//判断cpu是否在线 是否启用 忙的时候启用4个核心 闲的时候只用1个核心
rc = per_cpu(per_cpu_test, cpu_id);
//取得当前核心上的变量的值
printk("rc = 0x%lx\n", rc);
ptr = per_cpu_ptr(&per_cpu_test, cpu_id);
//取得当前核心上的变量的地址
printk("ptr.1 = 0x%lx\n", ptr);
*ptr = (*ptr) + 1;
*ptr = *ptr + 3;
//修改当前核心上的变量的值
} else{
printk("cpu not at line!\n" );
}
cpu_id = cpu_id + 1;
}
cpu_id = 0x00;
while (cpu_id < nr_cpu_ids){
rc = per_cpu(per_cpu_test, cpu_id);
printk("\nrcx = 0x%lx\n", rc);
ptr = per_cpu_ptr(&per_cpu_test, cpu_id);
printk("ptr.2 = 0x%lx\n", ptr);
cpu_id = cpu_id + 1;
}
}
运行日志:
[ 91.759570] in dump_show
[ 91.767682] rc = 0x12345694
[ 91.771165] ptr.1 = 0xea57f280
[ 91.774707] cpu not at line!
[ 91.778064] cpu not at line!
[ 91.781323] cpu not at line!
[ 91.784574]
[ 91.784574] rcx = 0x12345698
[ 91.789653] ptr.2 = 0xea57f280
[ 91.796426]
[ 91.796426] rcx = 0x12345680
[ 91.801441] ptr.2 = 0xea58e280
[ 91.808337]
[ 91.808337] rcx = 0x1234567c
[ 91.813240] ptr.2 = 0xea59d280
[ 91.819977]
[ 91.819977] rcx = 0x1234567c
[ 91.825037] ptr.2 = 0xea5ac280
感觉per_cpu变量很玄乎,写了一个测试代码,明白了他的作用和使用方法
白话理解: 就是假如cpu有4个核心,对于同一个变量 每个cpu核心都有他自己的变量地址
也就是说 一个变量 需要 占用 4个变量的空间 典型的以空间换效率
好处是多核心 竞争的时候 无需特别处理
因为操作的都是此核心的私有变量 与其他核心无关