linux驱动程序42:per-CPU变量
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变量相关推荐
- linux内核中的每cpu变量
一.linux中的每cpu变量 看linux内核代码的时候,会发现大量的per_cpu(name, cpu),get_cpu_var(name)等出现cpu字眼的语句.从语句的意思可以看出是要使用与当 ...
- Linux驱动程序编写
工作需要写了我们公司一块网卡的Linux驱动程序.经历一个从无到有的过程,深感技术交流的重要.Linux作为挑战微 软垄断的强有力武器,日益受到大家的喜爱.真希望她能在中国迅速成长.把程序文档贴出来, ...
- 嵌入式Linux驱动程序开发
嵌入式Linux驱动程序开发 1.设备驱动程序的概念... 2 2.处理器与设备间数据交换方式... 2 21.查询方式... 2 2.2.中断方式... 3 2.3.直接访问内存(DMA)方式... ...
- Linux top命令的cpu使用率和内存使用率
文章目录 前言 一.cpu使用率 1.1 top简介 1.2 cpu使用率的来源 1.3 内核相关源码 二.内存使用率 2.1 总内存有关的数据 2.2 进程使用内存有关的数据 2.3 内存使用率的来 ...
- Linux性能优化之CPU、内存、IO优化
Linux 的性能进行监测,以下是 VPSee 常用的工具: 工具 简单介绍 top 查看进程活动状态以及一些系统状况 vmstat 查看系统状态.硬件和系统信息等 iostat ...
- linux驱动程序是什么,简述一个Linux驱动程序的主要流程与功能
1. 简述一个Linux驱动程序的主要流程与功能. 2. 请列举一个软件中时间换空间或者空间换时间的例子. void swap(int a,int b) { int c; c=a;a=b;b=a; } ...
- 编译Linux驱动程序
基于Ubuntu 12.10,编译Linux驱动程序 1. 准备linux内核源码 此时,我要编译的驱动是基于Ubuntu 12.10内核的,所以我下载的是其对应的内核源码包: linux_3.5.0 ...
- c 调用 linux驱动程序,Linux下的C编程实战(五)――驱动程序设计
Linux下的C编程实战(五) ――驱动程序设计 1.引言 设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽硬件的细节,一般来说,Linux的设备驱动程序需要完成如下功能: (1)初始 ...
- Linux VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本
Linux VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本 288月2011 0 主要用于监控 linux 服务器负载及内存占用,如 MySQl.php-fpm,当负载或内存占 ...
最新文章
- tf.cast()数据类型转换
- 毛慧昀:决策树实现对鸢尾花数据集的分类
- Oracle学习之三 程序控制结构
- quantrader和matlab不匹配,【Matlab量化投资】支持向量机择时策略
- C指针原理(36)-C快速入门
- DTS开发记录(序)
- 解决pytorch DataLoader 加载数据报错UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xe5 in position 1023
- python安装在什么地方_python模块安装目录在哪里
- 方法、脚本-Pig Grunt之简单命令及实例说明-by小雨
- (转)李开复哥伦比亚大学演讲:如何才能不错过人工智能时代
- EasyUI(搭建框架layout布局)
- WinRAR各版本许可注册码
- 51单片机c语言定义寄存器r,在MCS51单片机中对特殊功能寄存器的C51定义
- 网络协议 -- HTTPS(3)SSL/TSL协议
- 一维条形码 code128 的全面介绍
- 简体中文转换为繁体中文
- 又一次算法作业hhhhhh
- as3读写本地xml/txt
- easyswoole消息队列
- 用这8个办公软件,效率高一倍