当前位置: 首页 > news >正文

linux 内存一致性

linux 出现内存一致性的场景

1、编译器优化 ,代码上下没有关联的时候,因为编译优化,会有执行执行顺序不一致的问题(多核单核都会出现)
2、多核cpu乱序执行,cpu的乱序执行导致内存不一致(多核出现)
3、dma 操作,dma操作外设,或者内存数据,cpu无法感知,仍然使用cache 数据,导致内存不一致(多核单核都会出现)

内存屏障

cpu 乱序导致的问题

如果CPU需要读取的地址中的数据已经已经缓存在了cache line中,即使是cpu需要对这个地址重复进行读写,对CPU性能影响也不大,但是一旦发生了cache miss(对这个地址进行第一次写操作),如果是有序处理器,CPU在从其他CPU获取数据或者直接与主存进行数据交互的时候需要等待不可用的操作对象,这样就会非常慢,非常影响性能。举个例子:

如果CPU0发起一次对某个地址的写操作,但是其local cache中没有数据,这个数据存放在CPU1的local cache中。为了完成这次操作,CPU0会发出一个invalidate的信号,使其他CPU的cache数据无效(因为CPU0需要重新写这个地址中的值,说明这个地址中的值将被改变,如果不把其他CPU中存放的该地址的值无效,那么就有可能会出现数据不一致的问题)。只有当其他之前就已经存放了改地址数据的CPU中的值都无效了后,CPU0才能真正发起写操作。需要等待非常长的时间,这就导致了性能上的损耗。

但是乱序处理器山就不需要等待不可用的操作对象,直接把invalidate message放到invalidate queues中,然后继续干其他事情,提高了CPU的性能,但也带来了一个问题,就是程序执行过程中,可能会由于乱序处理器的处理方式导致内存乱序,程序运行结果不符合我们预期的问题。

解决的办法-内存屏障

CPU内存屏障,指令

1、通用barrier,保证读写操作有序, mb()和smp_mb()

2、写操作barrier,仅保证写操作有序,wmb()和smp_wmb()

3、读操作barrier,仅保证读操作有序,rmb()和smp_rmb()

编译器重排导致的问题

int flag, data;void write_data(int value)
{data = value;flag = 1;
}void read_data(void)
{int res;while (flag == 0);res = data;flag = 0;return res;
}

我们拥有2个线程,一个用来更新数据,也就是更新data的值。使用flag标志data数据已经准备就绪,其他线程可以读取。另一个线程一直调用read_data(),等待flag被置位,然后返回读取的数据data。

如果compiler产生的汇编代码是flag比data先写入内存。那么,即使是单核系统上,我们也会有问题。在flag置1之后,data写45之前,系统发生抢占。另一个进程发现flag已经置1,认为data的数据已经准别就绪。但是实际上读取data的值并不是45(可能是上次的历史数据或者非法数据)。为什么compiler还会这么操作呢?因为,compiler是不知道data和flag之间有严格的依赖关系。这种逻辑关系是我们人为强加的

解决的办法-显式编译屏障

#define barrier() __asm__ __volatile__("": : :"memory")int a, b;void foo(void)
{a = b + 1;barrier();b = 0;
}

barrier()就是compiler提供的屏障,作用是告诉compiler内存中的值已经改变,之前对内存的缓存(缓存到寄存器)都需要抛弃,barrier()之后的内存操作需要重新从内存load,而不能使用之前寄存器缓存的值。并且可以防止compiler优化barrier()前后的内存访问顺序。barrier()就像是代码中的一道不可逾越的屏障

对于单个变量可以使用 volatile 或者是指针变量

dma 内存不一致

那DMA为什么和CPU的cache会产生cache一致性的问题呢,基本的原因的什么呢?我这里总结了几个。
1、DMA直接操作系统总线来读写内存地址,而CPU并不感知。
2、如果DMA修改的内存地址,在CPU的cache中有缓存,那么CPU并不知道内存数据被修改了,CPU依然去访问cache的旧数据,导致Cache一致性问题。

dam cache 一致性解决方法

1、使用硬件cache一致性的方案,需要CCI这种IP的支持。这个需要去查看一下你用的soc是否支持CCI控制器。

2、使用non-cacheable的内存来进行DMA传输,这种方案最简单,但效率最低,严重降低性能,还增加功耗。

3、使用软件主动干预的方法来帮助cache一致性。这个是比较常规的方法,特别是在类似CCI这种缓存一致性控制器没有出来之前,都用这种方式。对于DMA的操作,我们需要考虑两种情况。

软件干预dma 操作

在这里插入图片描述理解这里为什么要先做cache的clean或者flush操作的一个关键点是:比如这个图里,大家要想清楚,在DMA开始传输之前,最新的数据在哪里?很明显,在这个图里,在这个场景下的逻辑,最新数据有可能还在cache里,因为主机的软件产生数据,比如网卡发包,CPU的网络软件去组包,这个组包的过程,其实可以看成是CPU去create了新的数据,然后CPU把数据存在内存的DMA buffer里,这个过程中,有可能还有新的数据在CPU的cache里。所以,在启动DMA之前,我们需要调用cache的flush操作,把cache的数据回写到DMA buffer里。这个就是这个逻辑。

1、 在DMA拷贝前,进行一次CACHE CLEAN,将cache内容dirty回写,清除cache,保证在DMA传输时间内不会有回写动作,(也叫做写回(Writeback):DMA从内存中读取数据时,先强制将Cache中的内容写回到内存中)
2、 在DMA拷贝完成之后,进行一次CACHE FLUSH,保证CPU访问目的地址时cache会重新构建,目的地址的值一定是从DDR上读取最新数据。(也叫做写无效(Invalidate):DMA向内存中写入数据完成后,直接令Cache中的内容无效。这样CPU在读取Cache时必然要先从内存中读取数据到Cache)

一些嵌入式平台可能包括两级Cache,称为Inner Cache和Outer Cache。前者是内部Cache,位于CPU内部,也称为一级Cache或L1 Cache;后者是外部Cache,位于CPU外部,也称为二级Cache或L2 Cache。

几个常见的嵌入式平台如ARM、MIPS、PPC都采用软件管理Cache,提供相应的接口来管理Cache,但需要我们编写代码主动操作Cache。以ARM平台为例,Linux对DMA的数据一致性操作函数为dmac_flush_range()函数和outer_flush_range()函数,两个函数都同时进行了写无效操作和写回操作确保数据一致性。

1、针对Inner Cache。

extern void dmac_flush_range(const void *, const void *);

2、针对Outer Cache。

static inline void outer_flush_range(phys_addr_t start, phys_addr_t end)

参考网址:
https://blog.csdn.net/baidu_38797690/article/details/123234019
https://zhuanlan.zhihu.com/p/465411610
https://www.cnblogs.com/jerry116/articles/9206061.html
https://zhuanlan.zhihu.com/p/505956490?utm_id=0

相关文章:

linux 内存一致性

linux 出现内存一致性的场景 1、编译器优化 ,代码上下没有关联的时候,因为编译优化,会有执行执行顺序不一致的问题(多核单核都会出现) 2、多核cpu乱序执行,cpu的乱序执行导致内存不一致(多核出…...

Vue 如何监听 localstorage的变化

需求 分析 1. 初始想法 computed: {lonlat(){console.log(localStorage.getItem(lonlat))return localStorage.getItem(lonlat)}},watch: {lonlat(newVal,oldVal){console.log(1002,newVal,oldVal)}},我们想着用 计算属性 computed 和 watch 监听实现,但根本没有…...

ActiveMQ使用JDBC持久化消息

为了避免服务器宕机而导致消息丢失,ActiveMQ提供消息持久化机制。 ActiveMQ提供多种消息持久化的方式,如LevelDB Store、KahaDB 、AMQ、JDBC等,详情可以访问官网。 ActiveMQ默认是使用KahaDB持久化消息。在/conf/activemq.xml如下配置&…...

光环云出席Enjoy出海AIGC主题研讨会,助力企业迎接AI时代机遇与挑战

AIGC的崛起,为2023年的全球化突围之路拓展了想象空间。 从年初至今,OpenAI和ChatGPT高举高打,很大程度上起到了教育市场的作用;此外,Meta推出大模型,Snapchat、Soul、字节等大厂或上线或内测聊天机器人&…...

动态规划:路径和子数组问题(C++)

动态规划:路径和子数组问题 路径问题1.不同路径(中等)2.不同路径II(中等)3.下降路径最⼩和(中等)4.地下城游戏(困难) 子数组问题1.最大子数组和(中等&#xf…...

微服务-gateway跨域配置

文章目录 一、前言二、gateway跨域配置1、问题描述1.1、什么是跨域请求?1.1.1、同源策略1.1.2. 安全性考虑1.1.3. 跨域攻击 1.2、问题产生原因 2、解决方法2.1、修改配置文件2.2、配置类统一配置2.3、全局跨域拦截器 三、总结 一、前言 在SpringCloud项目中&#x…...

爬虫项目(二):中国大学排名

《Python网络爬虫入门到实战》京东购买地址,这里讲解了大量的基础知识和实战,由本人编著:https://item.jd.com/14049708.html配套代码仓库地址:https://github.com/sfvsfv/Crawer文章目录 分析第一步:获取源码分析第一…...

十二、MySQL(DQL)分组/排序/分页查询如何实现?

总括 select 字段列表 from 表名 [where 条件] (group by)/(order by)/(limit) 分组字段名 分组查询 1、分组查询 (1)基础语法: select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组之后的过滤条件] (…...

设计模式概念学习

创建类型 单例模式 饿汉 构建时就创建 懒汉 单线程-访问到的时候才创建多线程-低效率 做法:加锁->若未创建则创建->获取资源->解锁 缺点:效率低,每次访问之前都要加锁,资源创建之后不能被同时被多个线程访问多线程-…...

Spring MVC 五 - DispatcherServlet初始化过程(续)

今天的内容是SpringMVC的初始化过程,其实也就是DispatcherServilet的初始化过程。 Special Bean Types DispatcherServlet委托如下一些特殊的bean来处理请求、并渲染正确的返回。这些特殊的bean是Spring MVC框架管理的bean、按照Spring框架的约定处理相关请求&…...

day36:网编day3,TCP、UDP模型

下载&#xff1a; #include <myhead.h>#define ERR(s) do\ {\fprintf(stderr,"__%d__",__LINE__);\perror(s);\ }while(0) #define PORT 69 #define IP "192.168.115.184"int do_download(int cfd,struct sockaddr_in sin); //int do_upload(); int…...

MySQL——MySQL的基础操作部分

使用命令行登录 mysql -u root -p 直接敲击回车后输入密码即可&#xff1a; 当看到出现“mysql>“的符号之后&#xff0c;就表示已经进入到了&#xff2d;&#xff59;&#xff33;&#xff31;&#xff2c;系统中&#xff0c;就可以输入&#xff2d;&#xff59;&#xf…...

编译OpenWrt内核驱动

编译OpenWrt内核驱动可以参考OpenWrt内部其它驱动的编写例程&#xff0c;来修改成自己需要的驱动 一、OpenWrt源代码获取与编译 1.1、搭建环境 下载OpenWrt的官方源码&#xff1a; git clone https://github.com/openwrt/openwrt.git1.2、安装编译依赖项 sudo apt update -…...

文件上传漏洞-upload靶场5-12关

文件上传漏洞-upload靶场5-12关通关笔记&#xff08;windows环境漏洞&#xff09; 简介 ​ 在前两篇文章中&#xff0c;已经说了分析上传漏的思路&#xff0c;在本篇文章中&#xff0c;将带领大家熟悉winodws系统存在的一些上传漏洞。 upload 第五关 &#xff08;大小写绕过…...

Redis功能实战篇之Session共享

1.使用redis共享session来实现用户登录以及token刷新 当用户请求我们的nginx服务器&#xff0c;nginx基于七层模型走的事HTTP协议&#xff0c;可以实现基于Lua直接绕开tomcat访问redis&#xff0c;也可以作为静态资源服务器&#xff0c;轻松扛下上万并发&#xff0c; 负载均衡…...

leetcode235. 二叉搜索树的最近公共祖先(java)

二叉搜索树的最近公共祖先 题目描述递归 剪枝代码演示&#xff1a; 上期经典 题目描述 难度 - 中等 LC235 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q…...

2023物联网新动向:WEB组态除了用于数据展示,也支持搭建业务逻辑,提供与蓝图连线和NodeRed规则链类似的可视化编程能力

前言 组态编辑在工业控制、物联网场景中十分常见&#xff0c;越来越多的物联网平台也把组态作为一项标配功能。 物联网产业链自下往上由“端 - 边 - 管 - 云 -用”多个环节构成&#xff0c;组态通常是用于搭建数据展示类型的应用&#xff0c;而随着系统集成度越来越高&#x…...

react将文件转为base64进行上传

需求 将图片、pdf、word、excel等文件进行上传。图片、pdf等调接口A、word、excel等附件调接口B。接口关于文件是base64格式的参数 业务场景 上传资源&#xff0c;区分影像与附件 逻辑思路 使用原生input标签&#xff0c;typefile&#xff0c;进行上传上传后的回调&#x…...

生成式人工智能能否使数字孪生在能源和公用事业行业成为现实?

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 克服障碍&#xff0c;优化数字孪生优势 要实现数字孪生的优势&#xff0c;您需要数据和逻辑集成层以及基于角色的演示。如图 1 所示&#xff0c;在任何资产密集型行业&#xff08;如能源和公用事业&#xff09;中&…...

SpringBoot集成JWT token实现权限验证

JWTJSON Web Token 1. JWT的组成 JWTHeader,Payload,Signature>abc.def.xyz 地址&#xff1a;JSON Web Tokens - jwt.er 1.1 Header Header:标头。 两个组成部分&#xff1a;令牌的类型&#xff08;JWT&#xff09;和所使用的签名算法&#xff0c;经过Base64 Url编码后形成…...

算法通关村第11关【青铜】| 位运算基础

1.数字在计算机中的表示 原码、反码和补码都是计算机中用于表示有符号整数的方式。它们的使用旨在解决计算机硬件中的溢出和算术运算问题。 原码&#xff08;Sign-Magnitude&#xff09;&#xff1a; 原码最简单&#xff0c;它的表示方式是用最高位表示符号位&#xff0c;0表示…...

无涯教程-Android - RadioGroup函数

RadioGroup类用于单选按钮集。 如果我们选中属于某个单选按钮组的一个单选按钮,它将自动取消选中同一组中以前选中的任何单选按钮。 RadioGroup属性 以下是与RadioGroup控制相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以在运行时更改这些属性的相关…...

降噪音频转录 Krisp: v1.40.7 Crack

主打人工智能降噪服务的初创公司「Krisp」近期宣布推出音频转录功能&#xff0c;能对电话和视频会议进行实时设备转录。该软件还整合的ChatGPT&#xff0c;以便快速总结内容&#xff0c;开放测试版于今天上线。 随着线上会议越来越频繁&#xff0c;会议转录已成为团队工作的重…...

基于React实现:弹窗组件与Promise的有机结合

背景 弹窗在现代应用中是最为常见的一种展示信息的形式&#xff0c;二次确认弹窗是其中最为经典的一种。当我们在React&#xff0c;Vue这种数据驱动视图的前端框架中渲染弹窗基本是固定的使用形式。 使用方式&#xff1a;创建新的弹窗组件&#xff0c;在需要弹窗的地方引用并…...

docker使用(一)生成,启动,更新(容器暂停,删除,再生成)

docker使用&#xff08;一&#xff09; 编写一个 Dockerfile构建镜像构建失败构建成功 运行镜像运行成功 修改代码后再次构建请不要直接进行构建&#xff0c;要将原有的旧容器删除或暂停停止成功删除成功再次构建且构建成功&#xff01; 要创建一个镜像&#xff0c;你可以按照以…...

用Qt自制一个小闹钟

小闹钟 功能 当按下启动按钮时&#xff0c;停止按钮可用&#xff0c;启动按钮不可用&#xff0c;闹钟无法设置&#xff0c;无法输入自定义内容 当按下停止按钮时&#xff0c;暂停播报&#xff0c;启动按钮可用&#xff0c;闹钟可以设置&#xff0c;可以输入自定义内容 .pro文…...

Vue2.0/Vue3.0使用xlsx+xlsx-style实现导出Excel文件

一、依赖导入 1、Vue2 Webpack构建的 npm i xlsx npm i xlsx-style npm i file-saver同时修改以下&#xff1a; 解决 Can’t resolve ‘./cptable’ in ‘…’ 的问题&#xff0c;在 vue.config.js 文件中加入该配置 module.exports {externals: {./cptable: var cptable}…...

【Kafka系列】(一)Kafka入门

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 Kafka是什么&#xff1f; 一句话概括&#xff1a;「Apache Kafka 是一款开源的消息引擎系统」 什么是消息引擎系统&#…...

外包干了2个月,技术退步明显了...

先说一下自己的情况&#xff0c;大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年8月份&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

python实现语音识别

1. 首先安装依赖库 pip install playsound # 该库用于播放音频文件 pip install speech_recognition # 该库用于语音识别 pip install PocketSphinx # 语音识别模块中只有sphinx支持离线的&#xff0c;使用该模块需单独安装 pip install pyttsx3 # 该库用于将文本转换为语音播…...

做网站 会计分录/他达拉非

1.JSX 的地方&#xff0c;都要加上 type"text/babel" 。//新版本不需要 2.Browser.js 的作用是将 JSX 语法转为 JavaScript 语法&#xff0c;这一步很消耗时间&#xff0c;实际上线的时候&#xff0c;应该将它放到服务器完成。 3. 4. 5.我发现代码执行以后 和页面显示…...

wordpress如何仿站/厦门人才网招聘

之前写了一篇文章讲述如何使用UaModeler&#xff0c;后来经一个读者朋友提醒&#xff0c;才发现它是商业软件&#xff0c;不交钱只能创建有限数量的节点… 后来本人去查找了一下相关的免费软件&#xff0c;找到2款&#xff1a;一个是freeOPCUA下的opcua-modeler&#xff0c;网…...

昆山广告设计制作公司/开鲁网站seo不用下载

我们已经确定了帕斯卡三角的规则&#xff0c;下面是我的代码&#xff0c;非常实用哦&#xff01;&#xff01;&#xff01; #include<stdio.h> void main() { int i,j,n,k; scanf("%d",&n); for(i1;i<n;i) { k1; for(j…...

如何优化好一个网站/seo推广哪家公司好

百度&#xff0c;google1. 依靠拼音进行纠错2. 容易读错的拼音词进行纠错&#xff08;bin-->bing&#xff0c;掉diao念-->悼dao念&#xff09;3. 一些特别字出来4. 按照热门优先提示英文搜索按照空格进行分词 1. 缩写问题2. 词态问题 3. 容错问题 转载于:https://www.cn…...

wordpress管理员信息在哪/武汉网络关键词排名

什么是spring boot Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。用我的话来理解&#xff0c;就是spring boot其实不…...

网站代码怎么优化/合肥最新消息今天

2019独角兽企业重金招聘Python工程师标准>>> resultMap 元素是 MyBatis 中最重要最强大的元素。它就是让你远离从结果集中取出数据的JDBC 代码的那个东西,而且在一些情形下允许你做一些JDBC不支持的事情。ResultMap 的设计就是对于一些简单的语句我们不需要明确它们…...