per-cpu变量之间是如何同步的?
我想问问,per-cpu变量之间是如何同步的?即当cpu3更改了它本地的per-cpu变量之后,如果cpu0去读取该变量(cpu0本地副本),它应该读到修改后的值吧。那么该变量是如何从cpu3本地副本更新到cpu0本地副本的? 回复 1# tomxue0126为什么要更新,本来PER CPU变量就是一人CPU一个副本,互相独立的。这是它的本意,一个核改了,如果去同步修改到其它核的副本那不就成全局变量了吗。
访问别人的核的副本,用per_cpu就行了。它会下接算出对应的核的副本的地址的。
回复 2# Tinnal
谢谢答复!
不过还是没理解。
你也说每个CPU一个变量副本,既然是副本,好歹也要和原始变量保持一致吧?
如果每个CPU看到的变量副本值都不同,那这程序还能正常工作吗?
如果不需要和原始变量保持一致,那为什么不直接用4个不同的变量?(假设是个4核处理器)
per-cpu的出现是为了解决加锁的问题,但没说不要同步啊
你的论据基础就是错的,per-cpu字面意思就是一人一份,不用同步,自己用自己的 tomxue0126 发表于 2016-06-03 01:12 static/image/common/back.gif
回复 2# Tinnal
谢谢答复!
你把per-CPU的需求正好搞反了
说方案就是错的 本帖最后由 Tinnal 于 2016-06-06 10:30 编辑
回复 3# tomxue0126
回复 2# Tinnal
谢谢答复!
不过还是没理解。
你也说每个CPU一个变量副本,既然是副本,好歹也要和原始变量保持一致吧?
不会,各是各的。
如果每个CPU看到的变量副本值都不同,那这程序还能正常工作吗?
为什么不能呢
PERCPU变量的目的就是每核一份,不共享。 如果要共享,用全局变量就行了。
C语言有局部变量的概念,每个函数都是独立的,那程序会出问题吗?
如果不需要和原始变量保持一致,那为什么不直接用4个不同的变量?(假设是个4核处理器)
用4个不同的变量,不同核的代码就不能复用了呀。
per-cpu的出现是为了解决加锁的问题,但没说不要同步啊
没说,不代表要做。per_CPU的目的,是解决各核的数据依赖,让和个能并行工作,互相不阻塞。 >> 如果不需要和原始变量保持一致,那为什么不直接用4个不同的变量?(假设是个4核处理器)
可以用4个不同的变量,per_cpu的一种“朴素”实现是全局数组,每个core使用不同的下标/索引。
但如果是4个不同名字的变量的话,想象一下代码会写成什么样子?
if (core == 0) use_var(var_0);
else if (core == 1) use_var(var_1);
....
本帖最后由 tomxue0126 于 2016-06-06 11:50 编辑
谢谢楼上各位!
我大致理解了。主要是应用场景没想明白,后来找到一处代码如下,即各个CPU的中断mask。
这个在多核处理器中肯定是各个CPU独立标示的,这样就容易理解per-cpu为什么要这样设计了。struct irq_desc {
...
unsigned int __percpu *kstat_irqs; // @kstat_irqs: irq stats per cpu
...
struct cpumask *percpu_enabled;
页:
[1]