per-cpu变量是2.6内核的一个特性,当创建per-cpu变量时,系统中每个处理器都会拥有该变量的副本。对per-cpu变量的访问不需要锁定,可以保存在高速缓存中,频繁更新时有更好的性能。

头文件:<linux/precpu.h>

编译时创建per-cpu变量:DEFINE_PER_CPU(type, name);

创建数组变量:DEFINE_PER_CPU(int [2], int_arr);

访问某个给定变量的当前处理器副本:get_cpu_var(name);

结束访问:put_cpu_var(name);

访问其它处理器的变量副本:per_cpu(name, cpu_id);

动态分配per-cpu变量:

void *alloc_percpu(type);

void *__alloc_percpu(void *per_cpu_var, int cpu_id);//特定的对齐

释放动态分配的per-cpu变量:free_percpu(void *);

访问动态分配的per-cpu变量:per_cpu_ptr(void *per_cpu_var, int cpu_id);

int cpu_id;
cpu_id = get_cpu();//阻塞抢占
ptr = per_cpu_ptr(per_cpu_var, cpu_id);
put_cpu();

编译期间静态分配的per-cpu变量,get_cpu_var和put_cpu_var会处理阻塞抢占的细节,动态分配的per-cpu需要更多的保护。

导出per-cpu变量给其它模块:

EXPORT_PER_CPU_SYMBOL(name);

EXPORT_PER_CPU_SYMBOL_GPL(name);

其它模块访问时声明:DECLARE_PER_CPU(type, name);

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/percpu.h>DEFINE_PER_CPU(int, testPreCpu);
//EXPORT_PER_CPU_SYMBOL(testPreCpu);
//DECLARE_PER_CPU(int, testPreCpu);void test_per_cpu(void)
{int val = 0;int cpuId = 0;for_each_online_cpu(cpuId){val = per_cpu(testPreCpu, cpuId);printk("cpuId:%d, val:%d\n", cpuId, val);get_cpu_var(testPreCpu)++;put_cpu_var(testPreCpu);val = per_cpu(testPreCpu, cpuId);printk("cpuId:%d, val:%d\n", cpuId, val);      }
}static int __init hello_init(void)
{printk("hello_init. \n");test_per_cpu();return 0;
}static void __exit hello_exit(void)
{printk("hello_exit. \n");
}MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);

转:假如cpu有4个核心,对于同一个变量每个cpu核心都有他自己的变量地址,也就是说一个变量 需要占用 4个变量的空间,典型的以空间换效率,好处是多核心竞争的时候,无需特别处理,因为操作的都是此核心的私有变量,其他核心无关。

linux驱动程序42:per-CPU变量相关推荐

  1. linux内核中的每cpu变量

    一.linux中的每cpu变量 看linux内核代码的时候,会发现大量的per_cpu(name, cpu),get_cpu_var(name)等出现cpu字眼的语句.从语句的意思可以看出是要使用与当 ...

  2. Linux驱动程序编写

    工作需要写了我们公司一块网卡的Linux驱动程序.经历一个从无到有的过程,深感技术交流的重要.Linux作为挑战微 软垄断的强有力武器,日益受到大家的喜爱.真希望她能在中国迅速成长.把程序文档贴出来, ...

  3. 嵌入式Linux驱动程序开发

    嵌入式Linux驱动程序开发 1.设备驱动程序的概念... 2 2.处理器与设备间数据交换方式... 2 21.查询方式... 2 2.2.中断方式... 3 2.3.直接访问内存(DMA)方式... ...

  4. Linux top命令的cpu使用率和内存使用率

    文章目录 前言 一.cpu使用率 1.1 top简介 1.2 cpu使用率的来源 1.3 内核相关源码 二.内存使用率 2.1 总内存有关的数据 2.2 进程使用内存有关的数据 2.3 内存使用率的来 ...

  5. Linux性能优化之CPU、内存、IO优化

    Linux 的性能进行监测,以下是 VPSee 常用的工具: 工具    简单介绍 top    查看进程活动状态以及一些系统状况 vmstat    查看系统状态.硬件和系统信息等 iostat   ...

  6. linux驱动程序是什么,简述一个Linux驱动程序的主要流程与功能

    1. 简述一个Linux驱动程序的主要流程与功能. 2. 请列举一个软件中时间换空间或者空间换时间的例子. void swap(int a,int b) { int c; c=a;a=b;b=a; } ...

  7. 编译Linux驱动程序

    基于Ubuntu 12.10,编译Linux驱动程序 1. 准备linux内核源码 此时,我要编译的驱动是基于Ubuntu 12.10内核的,所以我下载的是其对应的内核源码包: linux_3.5.0 ...

  8. c 调用 linux驱动程序,Linux下的C编程实战(五)――驱动程序设计

    Linux下的C编程实战(五) ――驱动程序设计 1.引言 设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽硬件的细节,一般来说,Linux的设备驱动程序需要完成如下功能: (1)初始 ...

  9. Linux VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本

    Linux VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本 288月2011 0 主要用于监控 linux 服务器负载及内存占用,如 MySQl.php-fpm,当负载或内存占 ...

最新文章

  1. tf.cast()数据类型转换
  2. 毛慧昀:决策树实现对鸢尾花数据集的分类
  3. Oracle学习之三 程序控制结构
  4. quantrader和matlab不匹配,【Matlab量化投资】支持向量机择时策略
  5. C指针原理(36)-C快速入门
  6. DTS开发记录(序)
  7. 解决pytorch DataLoader 加载数据报错UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xe5 in position 1023
  8. python安装在什么地方_python模块安装目录在哪里
  9. 方法、脚本-Pig Grunt之简单命令及实例说明-by小雨
  10. (转)李开复哥伦比亚大学演讲:如何才能不错过人工智能时代
  11. EasyUI(搭建框架layout布局)
  12. WinRAR各版本许可注册码
  13. 51单片机c语言定义寄存器r,在MCS51单片机中对特殊功能寄存器的C51定义
  14. 网络协议 -- HTTPS(3)SSL/TSL协议
  15. 一维条形码 code128 的全面介绍
  16. 简体中文转换为繁体中文
  17. 又一次算法作业hhhhhh
  18. as3读写本地xml/txt
  19. easyswoole消息队列
  20. 用这8个办公软件,效率高一倍

热门文章

  1. tgp助手服务器连接失败,用TGP助手安装英雄联盟失败
  2. html5游戏开发马赛克对比,基于HTML5 Canvas的纯JS图片马赛克效果插件
  3. IT人员健康信号之眼睛保护
  4. 爬虫过程中的反爬问题
  5. gromacs PCA 做自由能景观图
  6. 虚拟机软件VMware Workstation Pro的安装与使用
  7. 将十进制分数转化成二进制
  8. PC连接三菱PLC的方法
  9. 什么是核心竞争力——源自半导体行业,一个上位机软件开发工程师
  10. 三年Java后端裸辞跳槽面试,却被面试官吊打