per_cpu变量的使用例子程序(内核态程序)

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个变量的空间 典型的以空间换效率

好处是多核心 竞争的时候 无需特别处理 

因为操作的都是此核心的私有变量 与其他核心无关

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值