第四章 第四节 per_cpu

我们上一章说了

实现内核同步的方法很多,如下表

技术

说明

适用范围

每CPU变量

在CPU之间复制数据结构

所有CPU

原子操作

对一个计数器原子地“读-修改-写”的指令

所有CPU

内存屏障

避免指令重新排序

本地CPU或所有CPU

自旋锁

加锁时忙等

所有CPU

信号量

加锁时阻塞等待

所有CPU

顺序锁

基于访问计数器的锁

所有CPU

本地中断的禁止

禁止单个CPU上的中断处理

本地CPU

本地软中断的禁止

禁止单个CPU上的可延迟函数处理

本地CPU

读-复制-更新(RCU)

通过指针而不是锁来访问共享数据结构

所有CPU

但是这个每CPU变量,让我看起来非常的拗口,什么是每CPU变量,我刚开始看的时候,以为别人写错了,后面又查了很多资料,确定是对的,才放心,原来是翻译的问题

优点

per_cpu的好处是访问它不需要加锁,而且这个变量存在CPU的cache里,访问速度会非常快

原英文是 per_cpu

/*

* Add a offset to a pointer but keep the pointer as is.

*

* Only S390 provides its own means of moving the pointer.

*/

#ifndef SHIFT_PERCPU_PTR

/* Weird cast keeps both GCC and sparse happy. */

#define SHIFT_PERCPU_PTR(__p, __offset) ({ \

__verify_pcpu_ptr((__p)); \

RELOC_HIDE((typeof(*(__p)) __kernel __force *)(__p), (__offset)); \

})

#endif

/*

* A percpu variable may point to a discarded regions. The following are

* established ways to produce a usable pointer from the percpu variable

* offset.

*/

#define per_cpu(var, cpu) \

(*SHIFT_PERCPU_PTR(&(var), per_cpu_offset(cpu)))

既然这么拗口,我觉得就没有必要翻译了,直接说明是per_cpu 就好了

怎么使用这个 per_cpu 呢?

在源码

drivers\cpufreq\cpufreq_userspace.c

下面有一个使用的历程

声明一个 per_cpu

static DEFINE_PER_CPU(unsigned int, cpu_is_managed);

#define DEFINE_PER_CPU(type, name) \

DEFINE_PER_CPU_SECTION(type, name, "")

使用一个per_cpu

get_cpu_var(var) 和 set_cpu_var(var)

使用另一个CPU的per_cpu变量

per_cpu(cpu_cur_freq, freq->cpu) = freq->new;

导出一个per_cpu 变量供其他模块使用

EXPORT_PER_CPU_SYMBOL(per_cpu_var);

EXPORT_PER_CPU_SYMBOL_GPL(per_cpu_var);

注意!!

在使用per_cpu的时候,记得禁止内核抢占

DECLARE_PER_CPU(int, mycounter);

● int cpu;

● preempt_disable(); //禁止抢占

● cpu = smp_processor_id();

● per_cpu(mycounter, cpu) += 1;

● preempt_enable(); //开启内核抢占

SMP系统chcae 命中

什么是smp 系统呢?就是有几个 CPU组成的芯片,就是我们通常说的几核几核的说法,大概的图像这样

           640?wx_fmt=png            

per_cpu解决的是多个CPU上共享数据的问题,如果声明了一个变量A,这个变量A在每个CPU下都有自己的副本,使用的堆栈地址也不一样,但是如果改变了A的值,其他的CPU同样能获取这个改变的值。

这样的话每个CPU只要关心单个CPU的并发问题,不用考虑多CPU的互斥加锁并发问题。

声明和定义Per-CPU变量的API

描述

DECLARE_PER_CPU(type, name) 

DEFINE_PER_CPU(type, name)

普通的、没有特殊要求的per cpu变量定义接口函数。没有对齐的要求

DECLARE_PER_CPU_FIRST(type, name) 

DEFINE_PER_CPU_FIRST(type, name)

通过该API定义的per cpu变量位于整个per cpu相关section的最前面。

DECLARE_PER_CPU_SHARED_ALIGNED(type, name) 

DEFINE_PER_CPU_SHARED_ALIGNED(type, name)

通过该API定义的per cpu变量在SMP的情况下会对齐到L1 cache line ,对于UP,不需要对齐到cachine line

DECLARE_PER_CPU_ALIGNED(type, name) 

DEFINE_PER_CPU_ALIGNED(type, name)

无论SMP或者UP,都是需要对齐到L1 cache line

DECLARE_PER_CPU_PAGE_ALIGNED(type, name) 

DEFINE_PER_CPU_PAGE_ALIGNED(type, name)

为定义page aligned per cpu变量而设定的API接口

DECLARE_PER_CPU_READ_MOSTLY(type, name) 

DEFINE_PER_CPU_READ_MOSTLY(type, name)

通过该API定义的per cpu变量是read mostly

per_cpu 在内存中固定的section

           640?wx_fmt=png            

参考资料:(公众号后台回复 per_cpu  获取)

           640?wx_fmt=png            

推荐阅读:

第4章 第三节 内核同步

第4章 原子操作 第二节


640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python的三维图片_python如何做三维图

Python三维绘图在遇到三维数据时,三维图像能给我们对数据带来更加深入地理解。python的matplotlib库就包含了丰富的三维绘图工具。1、创建三维坐标轴对象Axes3D创建Axes3D主要有两种方式,一种是利用关键字projection3dl来实现,另一种则是通过…

为何要使用docker

可能很多人听说过docker,也可能有很多人用过,但是其中的一些细节,可能不是很清楚,还有一些人,像我一样,并不知道docker,也没有用过,刚好最近一个大神朋友比较有空,让他写…

如何解决文件不存在_传奇微端配置Pak密码文件不存在怎么解决?传奇分享汇

在架设gom引擎的版本时,你是否有遇到和我一样的情况呢?微端配置后pak密码文件不存在是怎么回事呢?今天分享pak密码文件不存在的解决方法为什么会出现pak密码文件不存在呢?总结分析有以下2种原因会导致文件不存在1、没有配置对应的…

linux 统计命令执行后的行数或者统计目录下文件数目

ls |wc 是统计你这个目录下的文件数目。ls |wc -l是输出第一个结果即31即文件的数目。 转载于:https://www.cnblogs.com/apple2016/p/6956814.html

那些年,我们在?的那些日子

刚好在今天,我们几个比较好的朋友,都离开了一起奋斗的A公司。 先说明下,这个不是虚构的小说,也不是吹牛逼,就是记录我们几个曾经辉煌和落魄的日子,起名A公司也是为了保护大家的隐私,但是事情肯定…

db2 sql执行历史_5 个免费的在线 SQL 数据库环境,比Navicat 香!

来源&#xff1a;blog.csdn.net/horses/article/details/108603935作者&#xff1a;不剪发的Tony老师文章目录SQL FiddleDB Fiddledb<>fiddleSQL OnlineOracle Live SQL总结今天给大家分享几个在线的免费 SQL 运行环境&#xff0c;也就是在线数据库。这些网站可以帮助我们…

嵌入式入门必读

找到一个非常好的书籍而且不用购买的而且是高清版本的原来是放在我的知识星球里面的看到大家下载的也很多现在拿出来分享给大家从单片机到嵌入式这个不是一个简单的过程&#xff0c;其中从单进程到多进程&#xff0c;一个CPU如何做到多进程&#xff0c;怎么跑系统&#xff0c;调…

mysql远程访问 linux_Linux中开启mysql远程访问功能

1、确认3306是否对外开放&#xff0c;mysql默认状态下是不开放对外访问功能的。查看的办法如下&#xff1a;# netstat -an | grep 3306tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN从结果可以看出&#xff0c;mysql的3306端口只监听本地的连接&#xff0c;这样就阻碍了外部IP对该数…

致敬云南滑翔机

今天晚上&#xff0c;看了期待已久的篮球节目&#xff0c;我要打篮球&#xff0c;11点左右&#xff0c;感觉特别困&#xff0c;已经快睡着了&#xff0c;准备关掉电视的时候看到林书豪的图片&#xff0c;林书豪头上有一个标题《我要打篮球》&#xff0c;这个不就是《这&#xf…

震惊,用了这么多年的 CPU 利用率,其实是错的

来源&#xff1a;内核月谈, 原文链接&#xff1a;http://www.brendangregg.com/blog/2017-05-09/cpu-utilization-is-wrong.html本文中若有任何疏漏错误&#xff0c;责任在于编译者。有任何建议和意见&#xff0c;请回复内核月谈微信公众号&#xff0c;或通过 caspar at linux.…

string最大容量_string初步使用

1.什么是string?string是一个类&#xff0c;专门用来处理字符串。 而C语言中&#xff0c;字符串实际上是一个char的数组。2.实验#include #include using namespace std;int main(){ string str1 "hello world"; string str2 " smart"; char s…

【尺取或dp】codeforces C. An impassioned circulation of affection

http://codeforces.com/contest/814/problem/C 【题意】 给定一个长度为n的字符串s&#xff0c;一共有q个查询&#xff0c;每个查询给出一个数字m和一个字符ch&#xff0c;你的操作是可以改变字符串中的某些字母&#xff0c;最多改变m个&#xff0c;问操作后只包含字符ch的连续…

Linux 内核宏 time_after解析

同学们留言回复答案看看可能很多老鸟对这样的Linux 内核宏已经见惯不怪了&#xff0c;但是作为新手的Linux内核开发者&#xff0c;我觉得非常有必要了解其中的原理和作用。jiffies 这个想必大家已经非常熟悉&#xff0c;jiffies表示的是当前的系统时钟节拍总数&#xff0c;它统…

javascript mysql php_HTML、CSS、JavaScript、PHP、 MySQL 的学习顺序是什么?

下面是前端学习路线以及学习资源推荐&#xff1a;目录1. HTMLDOCTYPEHTML, XHTML, XML 差异性HTML5 新特性 及 语义化标签meta, img, script 等标签及其标签属性有兴趣可以了解 W3C 和 WHATWG HTML5 差异文章视频2. CSSCSS 基础CSS 布局CSS 动画CSS 预处理器(sass, less, stylu…

一个看似是系统问题的应用问题的解决过程

作者&#xff1a;王小二C 2019/09/04前言今天遇到一个问题&#xff0c;应用工程师分析是系统层的问题&#xff0c;然后就把这个锅给了我。最后我又把锅甩回给了应用工程师。异常log如下:I [2019-08-18 10:11:08 GMT8] binder: 1433:1561 transaction failed 29201/-28, size 8…

如何解决Binder泄漏问题

作者&#xff1a;王小二C 2019/09/06前言[011]一个看似是系统问题的应用问题的解决过程[1]中我们解决了一个注册过多的BroadcastReceiver导致的某一次发送广播失败的问题。我这边遇到了一个类似的问题&#xff0c;但是我用了一个可能网络上从来没有提出过的方法&#xff0c;解…

Docker-compose实战——Django+PostgreSQL

今天我们来用docker-compose 快速安装一个DjangoPostgreSQL的开发环境。 Compose简介 Compose 定位是“defining and running complex applications with Docker”&#xff0c;前身是 Fig&#xff0c;兼容 Fig 的模板文件。 Dockerfile 可以让用户管理一个单独的应用容器&#…

终于赢球了

感谢老将易建联我们要承认一个事实&#xff0c;阿联是这届男篮里面的老将&#xff0c;是唯一一个80后球员&#xff0c;很多人不了解老将意味着什么&#xff0c;很多打篮球的人都有一个感觉&#xff0c;在高中时代的时候&#xff0c;打球的时候经常在天上飞来飞去不觉得累&#…

Zookeeper原理和实战开发经典视频教程 百度云网盘下载

Zookeeper原理和实战开发 经典视频教程 百度云网盘下载 资源下载地址&#xff1a;http://pan.baidu.com/s/1o7ZjPeM 密码&#xff1a;r5yf 转载于:https://www.cnblogs.com/heitaok/p/6979781.html

C语言大神进来看看这个题目

之前一个读者给我发的一个题目&#xff0c;我大概看了下&#xff0c;题目的难度还是比较大的&#xff0c;而且考察的内容也比较多&#xff0c;可能在实际项目上使用比较少&#xff0c;估计十几年的老码农都没有用过&#xff0c;但是在看大神的代码的时候&#xff0c;就特别考验…