linux 内存屏障(barrier)分析

谈起内存屏障,大家感觉这个"玩意儿"很虚,不太实际,但是内核代码中又广泛地可以看到起身影。内存屏障,英文barrier,这个"玩意儿"它还不太好去定义它。barrier,中文翻译为栅栏,栅栏大家都见过,现实生活中就是防止他人或者动物非法闯入而用来进行隔离用的工具。再进一步,既然是防止闯入,那就是要保护栅栏内的东西。所以在linux 内核中,内存屏障用于保护内存的访问。

1、什么需要保护

下面来谈谈内存屏障到底保护什么。

比如cpu0执行 a = 1 这条指令时,假设a所在cache line已经在cpu1的 L1 cache中,cpu0 先要获取a所在的cache line到cpu0的L1cache中,由于是写操作,需要改写a的值,需要再总线上发送invalid消息让其他cpu使无效其cache中a的值,等待其他cpu应答后,cpu0才能改写a的值,这样才能保证cache一致性。

 等待其他cpu上使无效消息的应答期间造成了cpu0的无效等待,浪费时间。于是cpu设计者开始修改CPU设计,出现了使无效队列以及write buffer这些内部部件用来加速cpu的执行。具体内容读者可以查阅其他文章。

提升CPU执行效率(硬件层面)和编译器的优化使得指令重排序(软件层面)给程序员带来了负担,需要程序去进行进行内存访问顺序的维护及保序。

2、ARM提供的指令

ARM提供了如下指令来进行内存屏障的处理:

DMB:Data Memory Barrier,数据存储屏障

DSB:Date Synchronization Barrier,数据同步屏障

ISB:Instruction Synchronization Barrier,指令同步屏障

DMB和DSB的一个本质区别,DMB针对的是memory的load/store之间;DSB强调的是同类或不同类事物的先后完成。

Data Memory Barrier (DMB) ensures that all explicit memory accesses that appear in program order before the DMB instruction are observed

before any explicit memory accesses that appear in program order after the DMB instruction.

数据内存屏障(DMB)确保DMB指令之前的所有显式内存访问在DMB指令开始之后的任何显式内存访问之前被观察到。且DMB指令不影响处理上执行的任何其他指令的顺序。

Data Synchronization Barrier (DSB),No instruction in program order after this instruction executes until this instruction completes.

数据同步屏障(DSB)完成后,其后面的指令才可执行。可见DSB影响了其他指令的执行。

Instruction Synchronization Barrier (ISB) flushes the pipeline in the processor, so that all instructions following the ISB are fetched from cache or memory,

after the instruction has been completed.

指令同步屏障(ISB)冲刷处理器中的流水线,以便在ISB完成后,从缓存或内存中提取ISB之后的所有指令。可见ISB严重影响后续指令的执行。

3、linux内核实现

arch/arm/include/asm/barrier.h/*isb,dsb,dmb汇编指令*/
#define isb(option) __asm__ __volatile__ ("isb " #option : : : "memory")
#define dsb(option) __asm__ __volatile__ ("dsb " #option : : : "memory")
#define dmb(option) __asm__ __volatile__ ("dmb " #option : : : "memory")/*barrier:编译优化屏障,阻止编译器为了性能优化而进行指令重排*/
#define barrier() __asm__ __volatile__("": : :"memory")/*内存屏障(包括读和写),用于SMP和UP*/
#define mb()		do { dsb(); outer_sync(); } while (0)
/*读内存屏障,用于SMP和UP*/
#define rmb()		dsb()
/*写内存屏障,用于SMP和UP*/
#define wmb()		do { dsb(st); outer_sync(); } while (0)/*osh:outer shareable domain*/
#define dma_rmb()	dmb(osh)
#define dma_wmb()	dmb(oshst)/*用于SMP场合的内存屏障。*/
/*ish:inner shareable domain,在ish范围内客观测到结果*/
#define smp_mb()	dmb(ish)
/*用于SMP场合的读内存屏障*/
#define smp_rmb()	smp_mb()
/*用于SMP场合的写内存屏障*/
/*waits only for stores to complete, and only to the inner shareable domain.*/
#define smp_wmb()	dmb(ishst)

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

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

相关文章

iptables限制网速

1、使用hashlimit来限速 #从eth0网卡进入INPUT链数据,使用模块hashlimit 限制网速为100kb/s或2mb/s,超过限制的数据包会被DROP。OUTPUT链同理,mode为srcip,有4个mode选项: srcip(默认匹配每个源地址IP,配置指定源地址…

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【上篇】

【STM32开发笔记】移植AI框架TensorFlow【上篇】 一、TFLM是什么?二、TFLM开源项目2.1 下载TFLM源代码2.2 TFLM基准测试说明2.3 TFLM基准测试命令 三、TFLM初步体验3.1 PC上运行Keyword基准测试3.2 PC上运行Person detection基准测试3.3 No module named numpy问题解…

保障电气安全的电气火灾监控系统主要组成有哪些?

电气火灾是什么? 电气火灾一般是指由于电气线路、用电设备、器具以及供配电设备出现故障性释放的热能:如高温、电弧、电火花以及非故障性释放的能量;如电热器具的炽热表面,在具备燃烧条件下引燃本体或其他可燃物而造成的火灾&…

递归基础训练-路径总和

路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 我们可以把之前的…

docker在基础镜像上,比如rockylinux,如何配置yum仓库

在基础镜像rockylinux上 启动的容器,没有yum仓库,就执行不了一些命令 ~]docker run -itd --name linux rockylinux:8.5~]# docker exec -it linux bash /]# ifconfig bash: ifconfig: command not found/]# vim bash: vim: command not found …

计算机组成原理(笔记4)

定点加减法运算 补码加法&#xff1a; 补码减法&#xff1a; 求补公式&#xff1a; 溢出的概念 在定点小数机器中,数的表示范围为|&#xff58;|<1。在运算过程中如出现大于1的现象,称为 “溢出”。 上溢&#xff1a;两个正数相加&#xff0c;结果大于机器所能表示的最…

20240923软考架构-------软考186-190答案解析

每日打卡题186-190答案 186、Mesh 化架构是把&#xff08; &#xff09;从业务进程中分离&#xff0c;分离后在业务进程中只保留很“薄”的Client部分&#xff0c;Client 通常很少变化&#xff0c;只负责与 Mesh进程通信&#xff0c;原来需要在SDK中处理的流量控制、安全等逻辑…

数据结构-线性表的单链式存储结构图解及C语言实现

概念 链式存储&#xff1a;结点在存储器中的位置是任意的&#xff0c;即逻辑相邻的数据元素在物理上不一定相邻 链式存储结构也称非顺序映像或链式映像 图解 链式存储结构中结点一般有两个部分组成&#xff0c;即数据域(data)和指针域&#xff0c;数据域是用于存放数据的&…

开源ids snort (windows版)

Snort-IPS-on-Windows-main资源-CSDN文库 GitHub - eldoktor1/Snort-IPS-on-Windows: A comprehensive guide to installing and configuring Snort IPS on Windows, ensuring robust network security 手动打造Snortbarnyard2BASE可视化告警平台 - FreeBuf网络安全行业门户 …

JavaWeb--小白笔记07:servlet对表单数据的简单处理

这里的servlet对表单数据的处理是指使用IDEA创建web工程&#xff0c;再创建html和class文件进行连接&#xff0c;实现html创建一个表单网页&#xff0c;我们对网页中的表单进行填充&#xff0c;可以通过class文件得到网页我们填充的内容进行打印到控制台。 一登录系统页面---h…

Linux网络之UDP与TCP协议详解

文章目录 UDP协议UDP协议数据报报头 TCP协议确认应答缓冲区 超时重传三次握手其他问题 四次挥手滑动窗口流量控制拥塞控制 UDP协议 前面我们只是说了UDP协议的用法,但是并没有涉及到UDP协议的原理 毕竟知道冰箱的用法和知道冰箱的原理是两个层级的事情 我们首先知道计算机网…

1. BOOT.BIN 2. 固化 3. 启动 4. SDK 5. 文件

在进行FPGA的开发与固化过程中&#xff0c;生成BOOT.BIN文件是一个重要的步骤。BOOT.BIN文件通常包含了系统启动所需的不同文件&#xff0c;以下是如何创建和使用该文件的详细说明。 ### 生成BOOT.BIN文件的步骤 1. **方法一&#xff1a;通过项目构建** - 右键单击项目&#xf…

Android Camera 预览角度和拍照保存图片角度相关

–基于Android R(11) 关于Camera Camera Framework 的架构 Android Camera Framework 是一个分层架构&#xff0c;由以下组件组成&#xff1a; HAL&#xff08;硬件抽象层&#xff09;: HAL 抽象底层相机硬件,提供与不同设备相机进行交互的标准接口.CameraService : Camera…

怎么用gitee做一个图片仓库,在md文档中用这个图片网络地址,然后显示图片

痛因&#xff1a;我为什么要这样做&#xff0c;呃&#xff0c;我一开始图片都是存本地地址的&#xff0c;放在和这个md文档同级的assets文件夹下面&#xff0c;这样子确实当时很方便&#xff0c;复制粘贴什么也不用管&#xff0c;但是想把这个文档分享给别的人的时候&#xff0…

【软考】计算机系统硬件基本组成

目录 一、说明 一、说明 1. 计算机系统是由硬件和软件组成的&#xff0c;它们协同工作来运行程序。 2. 计算机的基本硬件系统由运算器、控制器、存储器、输入设备和输出设备5大部件组成。 3. 运算器、控制器等部件被集成在一起统称为中央处理单元(Central Processing Unit&…

美信监控易的优势:长期稳定运行

美信监控易作为一款运维产品&#xff0c;其显著的优势在于能够长期稳定运行。在IT运维领域&#xff0c;系统的稳定性是至关重要的&#xff0c;它直接关系到企业的业务连续性和客户满意度。美信监控易通过其自研的数据库和先进的监测技术&#xff0c;确保了系统的高可用性&#…

Frida-JSAPI:Interceptor使用

拦截器 Interceptor.attach(target, callbacks[, data]) 参数分析 target &#xff1a;target是一个NativePointer&#xff0c;用于指定想要拦截的函数的地址。callbacks &#xff1a;参数是一个包含一个或多个回调函数的对象。 onEnter(args) 回调函数&#xff0c;接收一个参…

Python习题 199:统计重复最多的随机数字

(编码题)用 Python 随机生成 99 个 1 到 100 的数字,统计重复数量最多的前 5 个数字。 from collections import Counter import randomnums = random.choices(range(1, 100), k=99

Qt快捷键说明与用法

编辑与查找 CtrlF&#xff1a;在当前编辑窗口中查找关键字。支持大小写相关、全词匹配、正则表达式匹配等选项&#xff0c;并且查找之后还可以进行替换操作。 CtrlShiftF&#xff1a;进行全局查找&#xff0c;不局限于当前文件。注意&#xff0c;在某些情况下&#xff0c;这个…

AWS EKS 中的负载均衡和 TLS 配置:全面指南

在现代云原生应用程序架构中,负载均衡器扮演着至关重要的角色。对于运行在 Amazon Elastic Kubernetes Service (EKS) 上的应用程序来说,理解和正确配置负载均衡是确保应用程序高可用性、可扩展性和安全性的关键。本文将全面介绍 AWS EKS 中的负载均衡配置,包括 Application…