初步认识Volatile-CPU层面的内存屏障

什么是内存屏障?从前面的内容基本能有一个初步的猜想,内存屏障就是将 store bufferes中的指令写入到内存,从而使得其他访问同一共享内存的线程的可见性。

X86的memory barrier指令包括lfence(读屏障) sfence(写屏障) mfence(全屏障)Store Memory Barrier(写屏障) 告诉处理器在写屏障之前的所有已经存储在存储缓存(store bufferes)中的数据同步到主内存,简单来说就是使得写屏障之前的指令的结果对屏障之后的读或者写是可见的

Load Memory Barrier(读屏障) 处理器在读屏障之后的读操作,都在读屏障之后执行。配合写屏障,使得写屏障之前的内存更新对于读屏障之后的读操作是可见的

Full Memory Barrier(全屏障) 确保屏障前的内存读写操作的结果提交到内存之后,再执行屏障后的读写操作

有了内存屏障以后,对于上面这个例子,我们可以这么来改,从而避免出现可见性问题

总的来说,内存屏障的作用可以通过防止CPU对内存的乱序访问来保证共享数据在多线程并行执行下的可见性 

但是这个屏障怎么来加呢?回到最开始我们讲volatile关键字的代码,这个关键字会生成一个Lock的汇编指令,这个指令其实就相当于实现了一种内存屏障

这个时候问题又来了,内存屏障、重排序这些东西好像是和平台以及硬件架构有关系的。作为Java语言的特性,一次编写多处运行。我们不应该考虑平台相关的问题,并且这些所谓的内存屏障也不应该让程序员来关心。

 

### 回答1: 内存屏障是一种CPU指令,用于保证内存访问的有序性。它可以分为编译屏障CPU执行乱序屏障。 编译屏障是在代码编译时插入的指令,用于告诉编译器在这个位置需要生成一条内存屏障指令。它可以保证在编译后生成的机器码中,这个位置的内存访问会被正确地序列化。 CPU执行乱序屏障是在CPU级别执行的指令,用于告诉CPU在这个位置需要保证内存访问的顺序性。在现代CPU中,由于硬件优化和多核并发等原因,CPU会对指令进行乱序执行,而乱序屏障可以保证在这个位置之前的所有内存访问都已经完成,从而避免了乱序执行带来的问题。 总的来说,内存屏障是一种非常重要的机制,可以保证多线程程序中的内存访问顺序性,避免出现数据竞争等问题。 ### 回答2: 内存屏障是指用于控制内存访问顺序的指令或者指令序列。根据其功能和作用方式的不同, 内存屏障可以分为编译屏障CPU执行乱序屏障。 编译屏障是在编译器层面进行优化控制的屏障。编译器在进行程序优化时,可能会对代码进行重排,以提高执行效率。然而,有些代码的执行顺序是有严格要求的,此时就需要使用编译屏障来保证指令的顺序。编译屏障可以用于控制指令的插入位置,确保指令的执行顺序符合预期。编译屏障通常是通过特殊的指令或者关键字来实现的,例如在C语言中的"__asm__ __volatile__"关键字。 CPU执行乱序屏障是在CPU层面进行指令乱序执行时的控制屏障。现代处理器在执行指令时会使用乱序执行技术,乱序执行可以提高指令级并行度从而提高处理器的性能。然而,在某些情况下,由于指令之间存在依赖关系,需要保证指令的执行顺序,此时就需要使用乱序屏障。乱序屏障可以阻止指令乱序执行的同时也确保了数据的一致性。乱序屏障一般是通过特殊的指令来实现的,例如在x86架构中的"mfence"指令。 总的来说,编译屏障主要是用于控制编译器对代码的优化,保证指令的执行顺序;而CPU执行乱序屏障主要是用于控制CPU对指令的乱序执行,保证指令的执行顺序。两者在不同的层面上起到了优化和控制的作用,都是为了保证程序的正确执行和数据的一致性。 ### 回答3: 内存屏障是一种在并发编程中用来确保内存操作有序性的机制。内存屏障分为编译屏障CPU执行乱序屏障两种类型。 编译屏障是在编译器层面上插入的指令,用于告诉编译器在指定位置之前的所有内存访问操作必须完成,并且在指定位置之后的所有内存访问操作必须等待。编译屏障可以通过优化和重排指令来提高程序执行效率,但是在多线程环境下可能会导致并发访问数据的顺序问题。因此,通过插入编译屏障来限制指令重排,确保内存操作按照预期的顺序进行。 CPU执行乱序屏障是在指令执行层面上插入的机制,用于告诉CPU在指定位置之前的所有内存访问操作必须完成,并且在指定位置之后的所有内存访问操作必须等待。CPU执行乱序屏障主要解决CPU乱序执行指令的问题,确保内存操作的顺序性。在现代处理器中,由于乱序执行可以提高指令执行效率,但可能导致结果和预期不符。因此,通过插入CPU执行乱序屏障来确保内存操作的有序性。 总结起来,编译屏障CPU执行乱序屏障是为了解决并发编程中的内存操作顺序问题而设计的机制。编译屏障在编译器层面上限制指令重排,确保内存操作有序进行;CPU执行乱序屏障在指令执行层面上限制指令乱序执行,保证内存操作的有序性。这两种屏障在不同的层面上发挥作用,共同保证程序的正确执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值