1. 简介

2.6内核的特性,每个处理器都拥有自己的变量副本。

2. 优势

每个处理器访问自己的副本,无需加锁,可以放入自己的cache中,极大地提高了访问与更新效率。常用于计数器。

3. 使用

相关头文件:<linux/percpu.h>

(1) 编译期间分配

声明:

[cpp] view plaincopy
  1. DEFINE_PER_CPU(type, name);

避免进程在访问一个per-CPU变量时被切换到另外一个处理器上运行或被其它进程抢占:

[cpp] view plaincopy
  1. get_cpu_var(变量)++;
  2. put_cpu_var(变量);

访问其他处理器的变量副本用这个宏:

[cpp] view plaincopy
  1. per_cpu(变量,int cpu_id);

(2) 动态分配与释放

动态分配per-CPU变量:

[cpp] view plaincopy
  1. void * alloc_percpu(type);
  2. void * __alloc_percpu(size_t size, size_t align); //可以做特定的内存对齐

释放动态分配的per-CPU变量:

[cpp] view plaincopy
  1. free_percpu();

访问动态分配的per-CPU变量的访问通过per_cpu_ptr完成:

[cpp] view plaincopy
  1. per_cpu_ptr(void * per_cpu_var, int cpu_id);

要想阻塞抢占,使用get_cpu()与put_cpu()即可:

[cpp] view plaincopy
  1. int cpu = get_cpu();
  2. ptr = per_cpu_ptr(per_cpu_var, cpu);
  3. put_cpu();

(3) 导出Per-CPU变量给模块

[cpp] view plaincopy
  1. EXPORT_PER_CPU_SYMBOL(per_cpu_var);
  2. EXPORT_PER_CPU_SYMBOL_GPL(per_cpu_var);

要在模块中访问这样一个变量,应该这样做声明:

[cpp] view plaincopy
  1. DECLARE_PER_CPU(type, name);

遍历cpu:

[cpp] view plaincopy
  1. for_each_online_cpu

4. 注意

在某些体系结构上,per-CPU变量可使用的地址空间是受限的,要尽量保持这些变量比较小。

5. Per-CPU变量的实现

每个CPU都有对应的专有的数据区,在start_kernel()中调用setup_per_cpu_areas()进行分配和初始化。通过数据区的首地址与偏移量信息访问Per-CPU变量。

Per-cpu 变量相关推荐

  1. linux内核中的每cpu变量

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

  2. linux进程网络均衡,linux多CPU进程负载均衡解析

    在linux中,支持对称smp的处理器模型,在多处理器的情况下,每个处理器都有自己的一个运行队列,这样就存在着分配不均的情况,有的cpu运行队列很多进程,导致一直很忙,有的cpu运行队列可能很少的进程 ...

  3. linux内核死锁检测机制 | oenhan,Linux内核CPU负载均衡机制 | OenHan

    还是神奇的进程调度问题引发的,参看Linux进程组调度机制分析,组调度机制是看清楚了,发现在重启过程中,很多内核调用栈阻塞在了double_rq_lock函数上,而double_rq_lock则是lo ...

  4. CPU Cache Line伪共享问题的总结和分析

    原文:吴一昊,杨勇 Linux阅码场 地址:CPU Cache Line伪共享问题的总结和分析 Table of Contents 1. 关于本文 2. 背景知识 2.1 存储器层次结构 2.2 多核 ...

  5. 实现自我隐藏 CPU 利用率的最佳方法,不妨一试!

    作者 | dog250 头图 | CSDN 下载自视觉中国 出品 | CSDN 博客 想不想让CPU利用率展示成一首优美的旋律,就像弹琴一样. 我的意思是,你想让系统以及 task 的 CPU 利用率 ...

  6. x86 PerCPU变量基址(gs寄存器)的原理

    0. 引子 我们在调试的时候发现,x86下有一个快捷方法,只需一条简单的汇编指令mov %gs:var就能取出某个percpu变量在当前cpu的值,非常高效. unsigned long get_me ...

  7. linux内核之Per-CPU变量

    前言 通过Per-cpu变量除了可以分配内存,还有一个最大的好处就是不需要考虑同步.最好的同步技术就是把不需要同步的内核放在首位,因为每种显示的同步原语都有不容忽视的开销. 本质:Per-cpu变量主 ...

  8. 优化多核CPU的TCP新建连接性能--重排spinlock

    2018/06/05 凌晨,雨夜! 迟到的雨,还是来了! 人们几乎已经逼近了单CPU的处理时延极限,于是人们希望通过多CPU的方式来提高处理带宽,从而得到更多的处理容量,理论上讲,这无可厚非,但现实中 ...

  9. 可以自己隐藏自己CPU利用率的Rootkit(附:Rootkit的root权限)

    想不想让CPU利用率展示成一首优美的旋律,就像弹琴一样. 我的意思是,你想让系统以及task的CPU利用率是多少它就是多少,一切都是由你的程序自己来 调制演奏. 这需要一种自指机制. 哈哈,完全可以, ...

  10. linux内核percpu变量声明,Linux内核同步:per_cpu变量

    per cpu变量相关函数和宏 DEFINE_PER_CPU_SHARED_ALIGNED(type,name):静态分配per_cpu数组,数组名为name,结构类型为type DEFINE_PER ...

最新文章

  1. 基础知识 一个工具给win7 win10的同学 或者MAC 可以跳过
  2. PAT甲级1145 Hashing - Average Search Time:[C++题解]哈希表、哈希表开放寻址法、二次探测法、求平均查找次数
  3. lighttpd+fastcgi 返回500错误码_阿根廷著名电视减肥冠军去世 临终前体重达到500公斤...
  4. CF1096D Easy Problem(DP)
  5. 杭电oj 1000 c++ 版本
  6. 朝鲜红星操作系统落后当今水准约10年
  7. python3简明教程-实验楼_#python实验楼教程#学Python哪里有一问一答的Python学习?求具体的~...
  8. unicode编码java_JAVA转化Unicode编码
  9. i8一点通如何加载虚拟光驱玩游戏
  10. Origin 使用笔记
  11. 网络安全--安全攻防概述
  12. 网络对时服务器(NTP校时服务器)应用港口信息化系统
  13. 用python画一个正方形
  14. ArchiSteamFarmV3.0使用服务器steam云挂卡
  15. 49种软件验收测试方法大分享,快来看
  16. 前端模板引擎 -- Freemarker
  17. 第一行代码-第二版(郭霖著)笔记十一(Material Design)
  18. NVIDIA NCCL 源码学习(八)- 数据通信链路transport的建立
  19. 大一上学期Python学习心得体会
  20. 图片补全《Globally and locally consistent image completion》

热门文章

  1. 判断浏览器是否为IE
  2. linux下无法安装VMware的解决方法
  3. POJ 1226 Substrings(后缀数组)
  4. Android UI设计中一些不错的示例及第三方控件
  5. linux之源程序编译安装
  6. 关于Apache的25个初中级面试题
  7. Android学习---解决Android Graphical Layout 界面效果不显示
  8. spring scheduled定时任务
  9. intellij idea 使用 git stash
  10. matlab 的 legend 用法