per-CPU是2.6内核中引入的,访问per-CPU变量几乎不需要锁,每个处理器都在其自己的副本上工作。这些副本是如何生成的呢?本文尝试解答这个问题。
静态per-CPU结构设计思路大体可以分为两个阶段:编译阶段和运行时阶段
在编译阶段,实际上只生成了一个CPU原本。系统中所有per-CPU结构都放到了一个叫做"data.percpu"的section中,在ld.S链接脚本有如下内容:
. = ALIGN(32);
__per_cpu_start = .;
.data.percpu : { *(.data.percpu) }
__per_cpu_end = .;
. = ALIGN(4096);
__init_end = .;
由这个链接脚本知道,
.data.percpu Section是处于init数据段的,在系统初始化结束后将被回收。那么,系统如何维持per-CPU数据呢?这个任务在运行时完成。在系统初始化阶段有一个函数会分配 NR_CPU * (
__per_cpu_end -
__per_cpu_start)大小的内存,然后将
data.percpu段中的CPU原本拷贝NR_CPU份到这块内存中。从此以后系统通过get_cpu_var访问per-CPU变量的时候就会根据自己的cpu_id找到对应的拷贝。
可见,静态per-CPU变量的locality非常好,CPU之间在Cache级都不彼此干扰。对于静态生成的per-CPU变量需要使用get_cpu_var来访问。
在讲述动态per-CPU结构之前不妨思考下,如何能把动态per-CPU的locality设计得跟静态的一样呢? 由于不知道系统中将会有多少动态结构出现,所以不宜采用预留内存的方式,这为我们的设计带来了很大挑战。实际上,Linux也没有完全解决这个问题,但还是做了最大程度的优化,手法也比较赞。考虑到per-CPU变量的访问模式,效率应该和静态方式不相上下。下面看看linux的处理方式。
动态per-CPU结构相对于静态结构来说,设计上更直观,但效率上要低一些。每次调用alloc_percpu(type)的时候会生成一个维度为NR_CPUS的指针数组,每个指针指向一个kzalloc/kmalloc_node出来的type型对象。Linux在这里采取了一个优化手段:如果第i个cpu在线(linux支持cpu的hot-plug),那么就采用kmalloc_node来分配空间,这个空间与cpu i的亲和性很高;如果cpu i不在线,则采用通用的kzalloc分配了。下面是空间分配代码:
对于动态生成的per-CPU变量需要用per_cpu_ptr来访问。
Ref: http://blog.csdn.net/qinzhonghello/archive/2008/12/30/3649293.aspx
Ref: http://blog.chinaunix.net/u/12325/showart.php?id=1274548
分享到:
相关推荐
A-PUF-FSM-Binding-Scheme-for-FPGA-IP-Protection-and-Pay-per-Device-Licensing
Office安装错误Per-user install not supported.txt
正确打开姿势用crash 中 p命令,能够打印percpu变量对应的内核地址空间中的虚拟地址crash当前并没有提供直接获取percpu变量的命令,不过已经有补
前端开源库-eslint-plugin-one-variable-per-vareslint插件每个var一个变量,每个var需要一个变量
PVP-Per-World-源码.rar
Exercise 7:Per-Pixel Shading的实现 要求: 1.绘制两个茶壶,一个使用固定管线的Per-Vertex Shading方式进行光照,另一个使用Per-Pixel Shading方式进行光照; 考察目的: 1.基本GLSL的了解和使用; 2.通过GLSL...
针对TSN的PSFP协议的初步理解, 整理了一份文档
「工控安全」asec-w04-derived-unique-token-per-transaction - APT 数据泄露 工控安全 勒索软件 大数据 APT攻击
《C++内存管理机制_60_侯捷》13.Per-class allocator 2
Accurate Per-Pixel Displacement Mapping using a Pyramid Structure 外国论文,高级~~
mm percpu-km.c - kernel memory based chunk allocation.
mm percpu-vm.c - vmalloc area based chunk allocation.
信息安全_数据安全_asec-w04-derived-unique-token-per-transaction 安全分析 企业安全 安全验证 安全 网络犯罪
Per Cpu operations in the Linux Kernel● Christoph LameterThe percpu subsystem has recently undergone some major changes that in some cases allow to avoid using expensive atomic instructions and ...
(WIR-PER-021)员工投诉管理办法及投诉程序.doc
PER 有两个变体:对齐方式和非对齐方。对齐方式用于:Iub、Iur、Iu 接口的ASN.1 的 传输编码。非对齐方式:仅用于空中(UU)接口的 ASN.1 转换,两者的编码过程基本相同。 在对齐的方式下,若前面所有单元的信息经编码后...
本篇文章给大家分享java多线程Thread-per-Message模式的相关知识点,对此有兴趣的朋友参考学习下。
gitpod-env-per-project GitPod帮助程序命令,用于特定于项目的环境变量。 默认情况下,GitPod不支持名称相同但作用域不同的变量。 例如,设置一个可变API_KEY为范围user/project1和设置变量API_KEY为范围user/...