为什么需要volatile 内存屏障障

让天下没有难学的技术
剖析Disruptor:为什么会这么快?(三)揭秘内存屏障
剖析Disruptor:为什么会这么快?(三)揭秘内存屏障
原文地址:
译者:杜建雄
校对:欧振聪
最近我博客文章更新有点慢,因为我在忙着写一篇介绍内存屏障()以及如何将其应用于的文章。问题是,无论我翻阅了多少资料,向耐心的和请教了多少遍,以试图理清一些知识点,可我总是不能直观地抓到重点。大概是因为我不具备深厚的背景知识来帮助我透彻理解。
所以,与其像个傻瓜一样试图去解释一些自己都没完全弄懂的东西,还不如在抽象和大量简化的层次上,把我在该领域所掌握的知识分享给大家 。Martin已经写了一篇文章《》介绍内存屏障的一些具体细节,所以我就略过不说了。
免责声明:文章中如有错误全由本人负责,与Disruptor的实现和里真正懂这些知识的大牛们无关。
主题是什么?
我写这个系列的博客主要目的是解析Disruptor是如何工作的,并深入了解下为什么这样工作。理论上,我应该从可能准备使用disruptor的开发人员的角度来写,以便在代码和技术论文[]之间搭建一座桥梁。这篇文章提及到了内存屏障,我想弄清楚它们到底是什么,以及它们是如何应用于实践中的。
什么是内存屏障?
它是一个CPU指令。没错,又一次,我们在讨论CPU级别的东西,以便获得我们想要的性能(Martin著名的Mechanical Sympathy理论)。基本上,它是这样一条指令: a)确保一些特定操作执行的顺序; b)影响一些数据的可见性(可能是某些指令执行后的结果)。
编译器和CPU可以在保证输出结果一样的情况下对指令重排序,使性能得到优化。插入一个内存屏障,相当于告诉CPU和编译器先于这个命令的必须先执行,后于这个命令的必须后执行。正如去拉斯维加斯旅途中各个站点的先后顺序在你心中都一清二楚。
内存屏障另一个作用是强制更新一次不同CPU的缓存。例如,一个写屏障会把这个屏障前写入的数据刷新到缓存,这样任何试图读取该数据的线程将得到最新值,而不用考虑到底是被哪个cpu核心或者哪颗CPU执行的。
和Java有什么关系?
现在我知道你在想什么——这不是汇编程序。它是Java。
这里有个神奇咒语叫volatile(我觉得这个词在Java规范中从未被解释清楚)。如果你的字段是volatile,Java内存模型将在写操作后插入一个写屏障指令,在读操作前插入一个读屏障指令。
这意味着如果你对一个volatile字段进行写操作,你必须知道:
1、一旦你完成写入,任何访问这个字段的线程将会得到最新的值。
2、在你写入前,会保证所有之前发生的事已经发生,并且任何更新过的数据值也是可见的,因为内存屏障会把之前的写入值都刷新到缓存。
举个例子呗!
很高兴你这样说了。又是时候让我来画几个甜甜圈了。
的指针(cursor)(译注:指向队尾元素)属于一个神奇的volatile变量,同时也是我们能够不用锁操作就能实现Disruptor的原因之一。
生产者将会取得下一个(或者是一批),并可对它(们)作任意改动, 把它(们)更新为任何想要的值。,在所有改动都完成后,生产者对ring buffer调用commit方法来更新序列号(译注:把cursor更新为该Entry的序列号)。对volatile字段(cursor)的写操作创建了一个内存屏障,这个屏障将刷新所有缓存里的值(或者至少相应地使得缓存失效)。
这时候,消费者们能获得最新的序列号码(8),并且因为内存屏障保证了它之前执行的指令的顺序,消费者们可以确信生产者对7号Entry所作的改动已经可用。
…那么消费者那边会发生什么?
消费者中的序列号是volatile类型的,会被若干个外部对象读取——其他的可能在跟踪这个消费者。/(取决于你看的是旧的还是新的代码)跟踪它以确保环没有出现重叠(wrap)的情况(译注:为了防止下游的消费者和上游的消费者对同一个Entry竞争消费,导致在环形队列中互相覆盖数据,下游消费者要对上游消费者的消费情况进行跟踪)。
所以,如果你的下游消费者(C2)看见前一个消费者(C1)在消费号码为12的Entry,当C2的读取也到了12,它在更新序列号前将可以获得C1对该Entry的所作的更新。
基本来说就是,C1更新序列号前对ring buffer的所有操作(如上图黑色所示),必须先发生,待C2拿到C1更新过的序列号之后,C2才可以为所欲为(如上图蓝色所示)。
对性能的影响
内存屏障作为另一个CPU级的指令,没有。内核并没有在多个线程间干涉和调度。但凡事都是有代价的。内存屏障的确是有开销的——编译器/cpu不能重排序指令,导致不可以尽可能地高效利用CPU,另外刷新缓存亦会有开销。所以不要以为用volatile代替锁操作就一点事都没。
你会注意到Disruptor的实现对序列号的读写频率尽量降到最低。对volatile字段的每次读或写都是相对高成本的操作。但是,也应该认识到在批量的情况下可以获得很好的表现。如果你知道不应对序列号频繁读写,那么很合理的想到,先获得一整批Entries,并在更新序列号前处理它们。这个技巧对生产者和消费者都适用。以下的例子来自:
long nextSequence = sequence + 1;
while (running)
final long availableSequence = consumerBarrier.waitFor(nextSequence);
while (nextSequence &= availableSequence)
entry = consumerBarrier.getEntry(nextSequence);
handler.onAvailable(entry);
nextSequence++;
handler.onEndOfBatch();
sequence = entry.getSequence();
catch (final Exception ex)
exceptionHandler.handle(ex, entry);
sequence = entry.getSequence();
nextSequence = entry.getSequence() + 1;
(你会注意到,这是个旧式的代码和命名习惯,因为这是摘自我以前的博客文章,我认为如果直接转换为新式的代码和命名习惯会让人有点混乱)
在上面的代码中,我们在消费者处理entries的循环中用一个局部变量(nextSequence)来递增。这表明我们想尽可能地减少对volatile类型的序列号的进行读写。
内存屏障是CPU指令,它允许你对数据什么时候对其他进程可见作出假设。在Java里,你使用volatile关键字来实现内存屏障。使用volatile意味着你不用被迫选择加锁,并且还能让你获得性能的提升。
但是,你需要对你的设计进行一些更细致的思考,特别是你对volatile字段的使用有多频繁,以及对它们的读写有多频繁。
PS:上文中讲到的Disruptor中使用的是一种完全不同于我目前为止所发表的博文中的命名习惯。我想下一篇文章会对旧式的和新式的命名习惯做一个对照。
延伸阅读:
原创文章,转载请注明: 转载自本文链接地址:
2012年毕业,先后在UC北京分部和广州UC工作。主要参与后端程序的java开发以及php web开发。对java多线程编程感兴趣,期望用编程技能做些与自身爱好相结合的事情。stay hungry,stay foolish(像外行一样思考,像专家一样实践)。2015年从心出发
Latest posts by 杜 建雄 ()
Related posts:
(6 votes, average: 4.33 out of 5)
Loading...2014年11月 硬件/嵌入开发大版内专家分月排行榜第一2014年6月 硬件/嵌入开发大版内专家分月排行榜第一
2014年12月 硬件/嵌入开发大版内专家分月排行榜第二2014年8月 硬件/嵌入开发大版内专家分月排行榜第二2010年7月 硬件/嵌入开发大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。指令乱序有编译期间指令乱序和执行期间指令乱序,编译期间指令乱序可以通过我的这篇博文了解一下,这篇文章里面简单谈下我对执行期间指令乱序的理解。
这里是我自己的搭建的博客地址,欢迎访问:
文中一些观点是自己琢磨出来的,不保证正确,欢迎拍砖,纠正我的错误。如果深入了解这块的知识,可以阅读文中提供的一些资料,比较权威。
先介绍关于指令的三个order
摘自《Memory Ordering in Modern Microprocessors, Part I》
Program order
the order in which the memory operations are specified in the code running on a given CPU.
Execution order
the order in which the individual memory-reference instructions are executed on a given CPU. The execution order can differ from program order due to both compiler and CPU-implementation optimizations.
本身执行就乱序了,相对于program order,这是由于1、编译器优化后生成的二进制指令顺序和程序写的不一致;2、CPU本身优化导致乱序执行。
Perceived order:
the order in which a given CPU perceives its and other CPUs' memory operations. The perceived order can differ from the execution order due to caching, interconnect and memory-system optimizations. Different CPUs might well perceive the same memory operations as occurring in different orders.
Perceived order是在smp系统中才有的,举个例子,两个线程分别在两个core上运行:
Pthread1: store A=1 store B=1
Pthread2: load
明明pthread1先写的A,后写的B,按理说pthread2读到B=1了,A应该也是一才对。这是因为pthread2先看到了B的变化,还没看到A变化,对于pthread2来说,他看到的pthread1的执行顺序是store B=1 store A=1。也就是说pthread1本身执行的顺序是正确的,但pthread2看到的pthrad1执行的顺序是乱的。
为什么会有execution order
在单核时代,为了充分利用CPU资源,computer architects have used instruction-level parallelization techniques to improve processor perfor mance. Instruction-level parallelism (ILP), also known as dynamic, or out-of-order execution, gives the CPU the ability to reorder instructions in an optimal way to eliminate pipeline stalls. The goal of ILP is to increase the number of instructions that are executed by the processor on a single clock cycle. 摘自 《Multi-core programming Increasing Performance through Software Multi-threading》.
&单核时代Out of order带来的问题
在访问设备时,通常会有这样的需求,先向端口A写入个数据,设备将结果写入到端口B,程序从端口B读取数据。
这样的程序是严重依赖于顺序的,如果顺序反了,就读不到正确的值,问题就大了。
解决这个问题的方法就是引入了memory barrier,CPU提供memory barrier指令,保证了memory barrier前后的指令的执行顺序。
&这就是为什么我们在阅读驱动源码时,为什么遇到类似mb(); rmb();等的语句,这都是linux内核提供的memory barrier,封装了底层CPU指令。 关于memory barrier,《linux kernel source -- Documentation/memory-barriers.txt》是个很好的文档。
《linux kernel source -- Documentation/memory-barriers.txt》中有这样一段描述:
Memory barriers are only required where there's a possibility of interaction between two CPUs or between a CPU and a device. &If it can be guaranteed that there won't be any such interaction in any particular piece of code, then memory barriers are unnecessary in that piece of code.
单cpu 多线程不考虑吗?
C[10] = {};
===================================
if (A==1) {
如上代码,如果thread1的执行顺序乱了,对于thread2,后果是很严重的。
对于这个问题,始终没有找到答案,我也只能尝试着回答一下。在单核时代,内存模型比较简单,遵循了sequential consistency《Shared Memory Consistency Models:A Tutorial》,即对内存操作会按顺序执行。而读写设备端口时,虽然发出了写端口的操作,但写操作没有完成,程序执行了读端口的命令,导致读的已经完成,而写还没完成,而出现乱序。内存系统如果有这样的情况发生,他能做到等写完再读,而对于独立的设备,他也保证这个的话,显然会比较复杂。
为什么会有Perceived order
到了多核时代,首先不只一个CPU执行指令了,然后,内存系统也复杂的多了,有一级、二级、三级缓存,并且每个核都有自己的缓存。
不同的读指令,执行的时间就会不同,有直接拿自己的缓存的,有在内存中读的。指令执行的时间不同,必然导致流水线上指令进一步乱序。
然后是写指令,指令执行完了,但写的操作不一定执行完了,可能只写在自己缓存上了,需要会写到内存中,可能还需要同步到其他的CPU的缓存中。写同步的速度不一致,也就带来了我们之前提到的Perceived order 问题。
当然,如果内存系统还保证sequential consistency,那么这些问题就不存在了,但是多核情况下保证sequential consistency远远要比单CPU要复杂,多核并行的优势就完全体现不出来了,基本上商业CPU都没有保证sequential consistency。
针对这样的问题,业界提成了多个内存一致性模型,不同的CPU有不同的处理,感兴趣的可以搜索以下文章了解:
《Shared Memory Consistency Models:A Tutorial》
《Memory Ordering in Modern Microprocessors, Part I》
我们怎么应对呢,依然是使用memory barrier,对照于单核时代的mb,rmb,wmb,smp系统中使用smp_mb等,解决smp系统中的指令乱序问题。
大部分编程中不会涉及到memory barrier的问题,并且一些原子操作和所有同步锁操作中帮我们处理了指令乱序的问题。但如果我们在并行编程中使用效率更高的无锁编程,那么就必须了解这方面的知识,摸清CPU的特性,正确的使用memory barrier。最好的方式是像内核那样,使用宏定义定义所有的memory barrier。在所有需要使用的地方都使用,只是在一些平台上,内存模型会更强一些,不需要,那就定义为空语句。
&我总结的比较浅,毕竟我也只是个入门,把这几天的看的东西总结以下,没有涉及很深。
如果你需要了解的更加深入,以下材料值得阅读:
&&& linux kernel source -- Documentation/memory-barriers.txt
&&& Shared Memory Consistency Models:A Tutorial
&&& Memory Ordering in Modern Microprocessors, Part I
&&& Memory Consistency Models for Shared-Memory Multiprocessors
&&& Memory Consistency and Event Ordering in Scalable Shared-Memory Multiprocessors
&&& Multi-core programming Increasing Performance through Software Multi-threading
阅读(...) 评论()帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:21&分页:姑娘请自重发信人: Brock (Noname), 信区: KernelTech
标&&题: Re: 内存屏障的问题,为什么要配对使用
发信站: 水木社区 (Wed Jun 25 16:49:07 2014), 转信 && nt是指window nt?
这玩意和操作系统还有关系? && 【 在 BigCarrot (大萝卜1号) 的大作中提到: 】
: 标&&题: Re: 内存屏障的问题,为什么要配对使用
: 发信站: 水木社区 (Wed Jun 25 16:26:50 2014), 转信
: 这些是针对nt指令用的
: 你用通常的内存访问指令是不需要这些fence的
: 【 在 Brock (Noname) 的大作中提到: 】
: : x86上是mfence,lfence,sfence,怎么是空呢?
: ※ 来源:·水木社区 newsmth.net·[FROM: 203.208.61.*]
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 61.172.11.*]
例如,每天爱你多一些发信人: rockyzhang (例如,每天爱你多一些), 信区: KernelTech
标&&题: Re: 内存屏障的问题,为什么要配对使用
发信站: 水木社区 (Wed Jun 25 16:50:29 2014), 转信 && non-temporal
【 在 Brock (Noname) 的大作中提到: 】
: nt是指window nt?
: 这玩意和操作系统还有关系?
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 217.140.104.*]
姑娘请自重发信人: Brock (Noname), 信区: KernelTech
标&&题: Re: 内存屏障的问题,为什么要配对使用
发信站: 水木社区 (Wed Jun 25 18:54:17 2014), 转信 && 3.10内核里的代码 && #ifdef CONFIG_X86_32
/* &&* Some non-Intel clones support out of order store. wmb() ceases to be a &&* nop for these. &&*/
#define mb() alternative(" addl $0,0(%%esp)", "mfence", X86_FEATURE_XMM2)
#define rmb() alternative(" addl $0,0(%%esp)", "lfence", X86_FEATURE_XMM2)
#define wmb() alternative(" addl $0,0(%%esp)", "sfence", X86_FEATURE_XMM)
#define mb()&&&&asm volatile("mfence":::"memory")
#define rmb()&& asm volatile("lfence":::"memory")
#define wmb()&& asm volatile("sfence" ::: "memory")
#endif &&&& 【 在 rockyzhang (例如,每天爱你多一些) 的大作中提到: 】
: 标&&题: Re: 内存屏障的问题,为什么要配对使用
: 发信站: 水木社区 (Wed Jun 25 16:50:29 2014), 转信
: non-temporal
: 【 在 Brock (Noname) 的大作中提到: 】
: : nt是指window nt?
: : 这玩意和操作系统还有关系?
※ 修改:·Brock 于 Jun 25 18:55:35 2014 修改本文·[FROM: 61.172.11.*]
: ※ 来源:·水木社区 newsmth.net·[FROM: 217.140.104.*]
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 61.172.11.*]
大萝卜1号发信人: BigCarrot (大萝卜1号), 信区: KernelTech
标&&题: Re: 内存屏障的问题,为什么要配对使用
发信站: 水木社区 (Wed Jun 25 22:25:03 2014), 转信 && cpu的特征难道不应该去翻cpu手册? && 另外我不知道出于什么目的,3.10要加上这些fence指令,难道就为了防止某些人会对相关内存使用nt指令或者字符串指令访问,旧版本是没有这些fence指令的,比如这本书就提到
或者你可以帮忙看一下相关补丁的log && 【 在 Brock (Noname) 的大作中提到: 】
: 3.10内核里的代码
: #ifdef CONFIG_X86_32
: ...................
&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 203.208.61.*]
姑娘请自重发信人: Brock (Noname), 信区: KernelTech
标&&题: Re: 内存屏障的问题,为什么要配对使用
发信站: 水木社区 (Thu Jun 26 08:10:04 2014), 转信 && 手册真没仔细看过
不过,我之前在别的os的x86实现,看到mb的实现就是这样,所以看到你的说法觉得奇怪,所以去看了下linux的实现
还有点我不太理解,intel之前搞过超线程,如果intel的cpu不支持重排,超线程是怎么实现的呢?
反正我现在也开始有点懵了 && 【 在 BigCarrot (大萝卜1号) 的大作中提到: 】
: 标&&题: Re: 内存屏障的问题,为什么要配对使用
: 发信站: 水木社区 (Wed Jun 25 22:25:03 2014), 转信
: cpu的特征难道不应该去翻cpu手册?
: 另外我不知道出于什么目的,3.10要加上这些fence指令,难道就为了防止某些人会对相关内存使用nt指令或者字符串指令访问,旧版本是没有这些fence指令的,比如这本书就提到
: 或者你可以帮忙看一下相关补丁的log
: 【 在 Brock (Noname) 的大作中提到: 】
: : 3.10内核里的代码
: : #ifdef CONFIG_X86_32
: : ...................
※ 修改:·Brock 于 Jun 26 08:18:21 2014 修改本文·[FROM: 61.172.11.*]
: ※ 来源:·水木社区 newsmth.net·[FROM: 203.208.61.*]
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 61.172.11.*]
大萝卜1号发信人: BigCarrot (大萝卜1号), 信区: KernelTech
标&&题: Re: 内存屏障的问题,为什么要配对使用
发信站: 水木社区 (Thu Jun 26 09:05:25 2014), 转信 &&&& 【 在 Brock (Noname) 的大作中提到: 】
: 标&&题: Re: 内存屏障的问题,为什么要配对使用
: 发信站: 水木社区 (Thu Jun 26 08:10:04 2014), 转信
: 手册真没仔细看过
: 不过,我之前在别的os的x86实现,看到mb的实现就是这样,所以看到你的说法觉得奇怪,所以去看了下linux的实现
: 还有点我不太理解,intel之前搞过超线程,如果intel的cpu不支持重排,超线程是怎么实现的呢?
: 反正我现在也开始有点懵了
你这里有不少错误的概念
1, multi threading和out of order还是in order没有关系,虽然现在大多数多线程x86是OOO,但是Bonnell核心的atom确是in order的多线程,非x86的in order多线程就更多了,比如niagara, power6
2 cpu核心是否ooo和memory consistency model没有关系,比如最ooo的x86实现的memory model确是较强的(strong memory model), arm cortex a8是顺序的,但是实现了weak memory model.&&&& :&&
: 【 在 BigCarrot (大萝卜1号) 的大作中提到: 】
: : 标&&题: Re: 内存屏障的问题,为什么要配对使用
: : 发信站: 水木社区 (Wed Jun 25 22:25:03 2014), 转信
: : cpu的特征难道不应该去翻cpu手册?
: : 另外我不知道出于什么目的,3.10要加上这些fence指令,难道就为了防止某些人会对相关内存使用nt指令或者字符串指令访问,旧版本是没有这些fence指令的,比如这本书就提到
: : 或者你可以帮忙看一下相关补丁的log
: : 【 在 Brock (Noname) 的大作中提到: 】
: : : 3.10内核里的代码
: : : #ifdef CONFIG_X86_32
: : : ...................
: ※ 修改:·Brock 于 Jun 26 08:18:21 2014 修改本文·[FROM: 61.172.11.*]
: : ※ 来源:·水木社区 newsmth.net·[FROM: 203.208.61.*]
: ※ 来源:·水木社区 newsmth.net·[FROM: 61.172.11.*]
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 203.208.61.*]
小波发信人: LittleWave (小波), 信区: KernelTech
标&&题: Re: 内存屏障的问题,为什么要配对使用
发信站: 水木社区 (Thu Jun 26 17:30:17 2014), 转信 &&&& 不太理解,超线程必须能乱序吧?因为超线程环境下顺序没办法保障啊 && 【 在 BigCarrot (大萝卜1号) 的大作中提到: 】
: 标&&题: Re: 内存屏障的问题,为什么要配对使用
: 发信站: 水木社区 (Thu Jun 26 09:05:25 2014), 转信
: 【 在 Brock (Noname) 的大作中提到: 】
: : 标&&题: Re: 内存屏障的问题,为什么要配对使用
: : 发信站: 水木社区 (Thu Jun 26 08:10:04 2014), 转信
: : 手册真没仔细看过
: : 不过,我之前在别的os的x86实现,看到mb的实现就是这样,所以看到你的说法觉得奇怪,所以去看了下linux的实现
: : 还有点我不太理解,intel之前搞过超线程,如果intel的cpu不支持重排,超线程是怎么实现的呢?
: : 反正我现在也开始有点懵了
: 你这里有不少错误的概念
: 1, multi threading和out of order还是in order没有关系,虽然现在大多数多线程x86是OOO,但是Bonnell核心的atom确是in order的多线程,非x86的in order多线程就更多了,比如niagara, power6
: 2 cpu核心是否ooo和memory consistency model没有关系,比如最ooo的x86实现的memory model确是较强的(strong memory model), arm cortex a8是顺序的,但是实现了weak memory model.&&
: : 【 在 BigCarrot (大萝卜1号) 的大作中提到: 】
: : : 标&&题: Re: 内存屏障的问题,为什么要配对使用
: : : 发信站: 水木社区 (Wed Jun 25 22:25:03 2014), 转信
: : : cpu的特征难道不应该去翻cpu手册?
: : : 另外我不知道出于什么目的,3.10要加上这些fence指令,难道就为了防止某些人会对相关内存使用nt指令或者字符串指令访问,旧版本是没有这些fence指令的,比如这本书就提到
: : : 或者你可以帮忙看一下相关补丁的log
: : : 【 在 Brock (Noname) 的大作中提到: 】
: : : : 3.10内核里的代码
: : : : #ifdef CONFIG_X86_32
: : : : /*
: : : : ...................
: : ※ 修改:·Brock 于 Jun 26 08:18:21 2014 修改本文·[FROM: 61.172.11.*]
※ 修改:·LittleWave 于 Jun 26 17:30:27 2014 修改本文·[FROM: 101.95.17.*]
: : : ※ 来源:·水木社区 newsmth.net·[FROM: 203.208.61.*]
: : ※ 来源:·水木社区 newsmth.net·[FROM: 61.172.11.*]
: ※ 来源:·水木社区 newsmth.net·[FROM: 203.208.61.*]
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 101.95.17.*]
大萝卜1号发信人: BigCarrot (大萝卜1号), 信区: KernelTech
标&&题: Re: 内存屏障的问题,为什么要配对使用
发信站: 水木社区 (Thu Jun 26 19:11:52 2014), 转信 &&&& 【 在 LittleWave (小波) 的大作中提到: 】
: 不太理解,超线程必须能乱序吧?因为超线程环境下顺序没办法保障啊
in order执行的cpu中指令在流水线中一级一级的往下走,为什么不能保证顺序 && : ※ 修改:·LittleWave 于 Jun 26 17:30:27 2014 修改本文·[FROM: 101.95.17.*]
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 203.208.61.*]
小波发信人: LittleWave (小波), 信区: KernelTech
标&&题: Re: 内存屏障的问题,为什么要配对使用
发信站: 水木社区 (Fri Jun 27 10:25:16 2014), 转信 && 我的理解哈,超线程不就是分析指令的并行性,然后同时执行么。
这一过程我觉得和乱序优化是类似的 && 【 在 BigCarrot (大萝卜1号) 的大作中提到: 】
: 标&&题: Re: 内存屏障的问题,为什么要配对使用
: 发信站: 水木社区 (Thu Jun 26 19:11:52 2014), 转信
: 【 在 LittleWave (小波) 的大作中提到: 】
: : 不太理解,超线程必须能乱序吧?因为超线程环境下顺序没办法保障啊
: in order执行的cpu中指令在流水线中一级一级的往下走,为什么不能保证顺序
: : ※ 修改:·LittleWave 于 Jun 26 17:30:27 2014 修改本文·[FROM: 101.95.17.*]
: ※ 来源:·水木社区 newsmth.net·[FROM: 203.208.61.*]
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 101.95.17.*]
fixme发信人: fixme (fixme), 信区: KernelTech
标&&题: Re: 内存屏障的问题,为什么要配对使用
发信站: 水木社区 (Fri Jun 27 11:41:23 2014), 转信 && 你说的是超线程还是超标量? && 【 在 LittleWave (小波) 的大作中提到: 】
: 我的理解哈,超线程不就是分析指令的并行性,然后同时执行么。
: 这一过程我觉得和乱序优化是类似的
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 220.248.0.*]
文章数:21&分页:
抽奖到手软!将狂欢进行到底!}

我要回帖

更多关于 volatile 内存屏障 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信