内存屏障简略介绍

简介: 内存屏障简略介绍

内存屏障,也称内存栅栏,内存栅障,屏障指令等, 是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作。

大多数现代计算机为了提高性能而采取乱序执行,这使得内存屏障成为必须。

语义上,内存屏障之前的所有写操作都要写入内存;内存屏障之后的读操作都可以获得同步屏障之前的写操作的结果。因此,对于敏感的程序块,写操作之后、读操作之前可以插入内存屏障。

大多数处理器提供了内存屏障指令:

完全内存屏障(full memory barrier)保障了早于屏障的内存读写操作的结果提交到内存之后,再执行晚于屏障的读写操作。

内存读屏障(read memory barrier)仅确保了内存读操作;

内存写屏障(write memory barrier)仅保证了内存写操作。

Windows API的内存屏障实现,下述同步函数使用适当的屏障来确保内存有序:

1、进出临界区(critical section)的函数

2、触发(signaled)同步对象的函数

3、’等待函数(Wait function)

4、互锁函数(Interlocked function) [1]

多线程编程:

多线程程序通常使用高层程序设计语言中的同步原语,如Java与.NET Framework,或者API如pthread或Windows API。因此一般不需要明确使用内存屏障。

内存可见性:

内存可见性问题,主要是高速缓存与内存的一致性问题。一个处理器上的线程修改了某数据,而在另一处理器上的线程可能仍然使用着该数据在专用cache中的老值,这就是可见性出了问题。解决办法是令该数据为volatile属性,或者读该数据之前执行内存屏障。

乱序执行与编译器重排序优化的比较

C与C++语言中,volatile关键字意图允许内存映射的I/O操作。这要求编译器对此的数据读写按照程序中的先后顺序执行,不能对volatile内存的读写重排序。因此关键字volatile并不保证是一个内存屏障。

对于Visual Studio 2003,编译器保证对volatile的操作是有序的,但是不能保证处理器的乱序执行。因此,可以使用InterlockedCompareExchange或InterlockedExchange函数。

对于Visual Studio 2005及以后版本,编译器对volatile变量的读操作使用acquire semantics,对写操作使用release semantics。 [1]

相关文章
|
存储 缓存 数据安全/隐私保护
Windows 命令提示符(CMD)操作(二):系统信息和管理
Windows 命令提示符(CMD)操作(二):系统信息和管理
|
5月前
|
运维 算法 网络安全
注意:单张SSL证书签发有效期将陆续缩短至199天?阿里云SSL证书将升级为订阅服务模式
自2026年2月起,阿里云SSL证书将升级为订阅服务模式,以应对CA/B论坛新规——单张证书有效期缩短至200天。用户可选1/2/3年订阅,在有效期内自动获取多张新证书,保障服务连续性,降低运维压力。(239字)
658 3
|
机器学习/深度学习 数据可视化
如何解决大语言模型的幻觉问题
如何解决大语言模型的幻觉问题
|
存储 关系型数据库 MySQL
开源PolarDB- X|替换Opengemini时序数据场景下产品力校验
本文作者:黄周霖,数据库技术专家,就职于南京北路智控股份有限公司,负责数据库运维及大数据开发。
|
开发工具 Android开发
Android Studio resource linking failed
Android Studio resource linking failed
639 1
|
C语言
ASCII 定义了 128 个字符
【10月更文挑战第13天】ASCII 定义了 128 个字符。
2444 2
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
4403 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
网络协议 Linux Shell
Linux下常用的端口转发工具
【7月更文挑战第27天】Linux下常用的端口转发工具
1755 14
|
缓存 前端开发 关系型数据库
RPM与YUM
RPM与YUM
714 0
【比较】交互图——顺序图和协作图
前言: 所谓交互图,是描述对象之间的关系以及对象之间的信息传递的图,可分为顺序图和协作图。
968 0
【比较】交互图——顺序图和协作图