内存屏障 - LINUX KERNEL MEMORY BARRIERS 上 与 下

内存屏障(Memory Barrier)是在计算机体系结构中使用的一种同步机制,用于确保在多线程或多核处理器环境中,对共享内存的操作按照预期顺序进行。它们通过强制在特定点执行一些指令来规定内存访问的顺序,并防止内存乱序执行带来的不一致性问题。

内存屏障分为两种类型:读屏障(Read Barrier)和写屏障(Write Barrier)。

读屏障用于确保在读操作之前,所有该读操作之前的写操作已经完成。它可以防止指令乱序执行,保证读取到的数据是最新的。

写屏障用于确保在写操作之前,所有该写操作之前的写操作和读操作都已经完成。它可以防止指令乱序执行,保证写入的数据不会被其他操作覆盖或丢失。

内存屏障的使用能够解决多线程或多核处理器中的原子性、可见性和有序性等问题,确保程序的正确性和一致性。在编写并发程序时,合理地使用内存屏障可以提高程序的性能和正确性。

void foo(void)
{a = 1;smp_mb();b = 1;
}void bar(void)
{while (b == 0) continue;assert(a == 1);
}

https://www.kernel.org/doc/Documentation/memory-barriers.txticon-default.png?t=N7T8https://www.kernel.org/doc/Documentation/memory-barriers.txt

Consider the following abstract model of the system::                ::                ::                :+-------+   :   +--------+   :   +-------+|       |   :   |        |   :   |       ||       |   :   |        |   :   |       || CPU 1 |<----->| Memory |<----->| CPU 2 ||       |   :   |        |   :   |       ||       |   :   |        |   :   |       |+-------+   :   +--------+   :   +-------+^       :       ^        :       ^|       :       |        :       ||       :       |        :       ||       :       v        :       ||       :   +--------+   :       ||       :   |        |   :       ||       :   |        |   :       |+---------->| Device |<----------+:   |        |   ::   |        |   ::   +--------+   ::                :

(memory barriers logically act on the dotted line in the following diagram):<--- CPU --->         :       <----------- Memory ----------->:+--------+    +--------+  :   +--------+    +-----------+|        |    |        |  :   |        |    |           |    +--------+|  CPU   |    | Memory |  :   | CPU    |    |           |    |        ||  Core  |--->| Access |----->| Cache  |<-->|           |    |        ||        |    | Queue  |  :   |        |    |           |--->| Memory ||        |    |        |  :   |        |    |           |    |        |+--------+    +--------+  :   +--------+    |           |    |        |:                 | Cache     |    +--------+:                 | Coherency |:                 | Mechanism |    +--------++--------+    +--------+  :   +--------+    |           |    |	      ||        |    |        |  :   |        |    |           |    |        ||  CPU   |    | Memory |  :   | CPU    |    |           |--->| Device ||  Core  |--->| Access |----->| Cache  |<-->|           |    |        ||        |    | Queue  |  :   |        |    |           |    |        ||        |    |        |  :   |        |    |           |    +--------++--------+    +--------+  :   +--------+    +-----------+::

Cache 一致性问题出现的原因是在一个多处理器系统中,每个处理器核心都有独占的Cache 系统(比如一级 Cache 和二级 Cache),而导致一个内存块在系统中同时可能有多个备份,从而引起访问时的不一致性问题。Cache 一致性问题的根源是因为存在多个处理器独占的 Cache,而不是多个处理器。它的限制条件比较多:多核,独占 Cache,Cache 写策略。当其中任一个条件不满足时便不存在cache一致性问题。

 

 

read: 包含要读取的CACHE-LINE的物理地址
read response: 包含READ请求的数据,要么由内存满足要么由cache满足
invalidate: 包含要invalidate的cache-line的物理地址,所有其他cache必须移除相应的数据项
invalidate ack: 回复消息
read invalidate: 包含要读取的cache-line的物理地址,同时使其他cache移除该数据。需要read response和invalidate ack消息
writeback:包含要写回的数据和地址,该状态将处于modified状态的lines写回内存,为其他数据腾出空间

 

void foo(void)
{a = 1;smp_mb();b = 1;
}

smp_mb()指令可以迫使CPU在进行后续store操作前刷新store-buffer。以上面的程序为例,增加memory barrier之后,就可以保证在执行b=1的时候CPU0-store-buffer中的a已经刷新到cache中了,此时CPU1-cache中的a 必然已经标记为invalid。对于CPU1中执行的代码,则可以保证当b==0为假时,a已经不在CPU1-cache中,从而必须从CPU0- cache传递,得到新值“1”

 

 

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

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

相关文章

弱网对抗的策略有哪些?

在弱网环境下&#xff0c;数据传输可能会面临丢包、延迟、抖动等问题&#xff0c;因此采取合适的弱网对抗策略对于确保数据传输的稳定性和可靠性至关重要。以下是一些常见的弱网对抗策略&#xff1a; 数据压缩&#xff1a;使用压缩算法如Gzip、Brotli等对数据进行压缩&#xf…

Linux-vi/vim

vi是一个文本编辑器&#xff0c;用于撰写文档或开发程序 vim是vi的增强版&#xff0c;功能一致&#xff0c;可视化效果更好一些&#xff0c;去鼠标化&#xff0c;编辑更加方便&#xff0c;可定制化 vim编辑器是一个模式化文本编辑工具 vim有三种模式 编辑模式、插入模式和末…

使用PageHelper分页插件,发现获取到的total总记录数量不对,无法获取到正确的total数量

目录 1.1、错误描述 1.2、解决方案 1.1、错误描述 周一在工作中&#xff0c;写了一个列表分页的接口&#xff0c;其中使用的是PageHelper分页依赖&#xff0c;原本想着挺简单的&#xff0c;也就是使用PageHelper.startPage(pageNum, pageSize);方法就可以了&#xff0c;代码…

Linux下COOLFluiD源码编译安装及使用

目录 软件介绍 基本依赖 其它可选依赖 一、源码下载 二、解压缩&#xff08;通过Github下载zip压缩包格式&#xff09; 三、编译安装 3.1 依赖项-BOOST 3.2 依赖项-Parmetis 3.3 依赖项-PETSc 3.4 安装COOLFluiD 四、算例运行 软件介绍 COOLFluiD&#xff08;面向对象…

学术共振 美妙发声 | 2024美沃斯大会完美收官,米兰柏羽倾力承办

5月10日-5月12日&#xff0c;为期3天的第十七届美沃斯医疗美容大会在杭州国际博览中心盛大举办&#xff0c;作为行业顶级学术交流平台&#xff0c;本届美沃斯大会不仅是医美行业的一次学术交流盛会&#xff0c;更是一次深度探讨行业未来的远眺之窗。 5月9日&#xff0c;即美沃…

golang中switch-case及select-cas

switch a{ case b: 执行内容b case c: 执行内容c } golang中case后自带break跳出功能&#xff0c;既&#xff1a;满足case b 执行内容b后自动跳出&#xff0c;不会去走case c select { case <- ch1: 执行内容b case -<ch2: 执行内容c default: fmt.Println("chan…

定时备份docker-MySQL中的所有数据库

backup_mysql.sh #!/bin/bash# 设置备份存储目录 backup_dir"/docker/hunqingyun-docker/mysql/backup"# 设置 MySQL 容器名称和备份文件名 mysql_container"ruoyi-mysql" backup_file"$backup_dir/$(date %Y%m%d%H%M%S).sql"# MySQL root 用户…

vue-router路由,带参数的动态路由匹配(2024-05-14)

需求 需要将给定匹配模式的路由映射到同一个组件。例如&#xff0c;我们可能有一个 User 组件&#xff0c;它应该对所有用户进行渲染&#xff0c;但用户 ID 不同。在 Vue Router 中&#xff0c;我们可以在路径中使用一个动态字段来实现&#xff0c;我们称之为 路径参数 &#…

添砖Java之路(其五)——封装,String,StringBuilder类。

封装&#xff1a; 封装意义&#xff1a;更好的维护数据&#xff0c;让使用者无需关心如何使用&#xff0c;只需要知道怎么使用。 Java Bean&#xff1a; 然后我们要知道Java Bean(实体类)标准。 1.对于这个类的成员都需要设为私有&#xff0c;而且要对外提供相应Get,Set的接…

组合商标申请如何风控提高通过率!

最近一个老客户找到普推知产老杨&#xff0c;说要申请注册一个新的商标&#xff0c;是一个组合商标&#xff0c;有图形&#xff0c;两行文字&#xff0c;一行文字的拼音&#xff0c;还有三个字母的简称&#xff0c;组合商标在申请时会进行拆分审查&#xff0c;图形、文字、拼音…

【C++初阶】第十一站:list的介绍及使用

目录 list的介绍及使用 1.list的含义 2.list的介绍 3.list的使用 1.list的构造 2.list iterator的使用 3.list capacity 4.list element access 5 list modifiers 尾插尾删 和 头插头删 insert 和 erase resize swap clear 6.list sort and reverse 7.list copy vector copy li…

Java身份证识别接口集成开发示例,身份证查询接口

人类是有情感的&#xff0c;人们所接触到的各种事物和信息都会被身体相应器官所接收&#xff0c;然后通过神经元传入大脑继而被识别&#xff0c;然后大脑便会产生对该事物的认知和情绪。人们大多喜欢热情、有趣的事物&#xff0c;对冷冰冰、枯燥、无趣的APP基本是提不起兴趣的。…

16.Set、泛型、枚举、反射、Class

Set Set集合是Collection集合的子接口&#xff0c;元素不能重复&#xff0c;只能有一个null&#xff0c;元素存放无序。 常用子类 HashSet TreeSet LinkedHashSet HashSet 其实底层就是HashMap&#xff0c;当我们构造一个HashSet对象&#xff0c;就是在 new HashSet(); …

23. 合并 K 个升序链表 - 力扣(LeetCode)

基础知识要求&#xff1a; Java&#xff1a;方法、while循环、for循环、PriorityQueue类、if判断 Python&#xff1a; 方法、while循环、for循环、heapq 模块、if判断 数据结构:队列 题目&#xff1a; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链…

11.php-fpm模板(监控页面取值)

php-fpm模板(监控页面取值) 开启监控页面配置 #修改php配置文件 vim /etc/php-fpm.d/www.conf pm.status_path /php_status#修改nginx配置文件,添加到nginx配置文件中 vim /etc/nginx/conf.d/default.conflocation /php_status {root html;fastcgi_pass 127.0.…

肥猫“也能变“型男“?揭秘福派斯牛肉高脂猫粮的神奇效果!

福猫养成指南&#xff1a;福派斯牛肉高脂猫粮的优点与考虑因素 福派斯牛肉高脂猫粮&#xff0c;这款富含蛋白质与脂肪的猫粮&#xff0c;仿佛是猫咪世界中的美味佳肴&#xff0c;让无数猫咪为之倾倒。然而&#xff0c;这款猫粮的利与弊&#xff0c;你是否都了解呢&#xff1f;接…

AI模型部署实战:利用OpenCV的CUDA模块加速视觉模型部署流程

本文首发于公众号【DeepDriving】&#xff0c;欢迎关注。 一. 前言 我在之前的文章《AI模型部署实战&#xff1a;利用CV-CUDA加速视觉模型部署流程》中介绍了如何使用CV-CUDA库来加速视觉模型部署的流程&#xff0c;但是CV-CUDA对系统版本和CUDA版本的要求比较高&#xff0c;在…

大模型介绍

大模型通常指的是参数量超过亿级别&#xff0c;甚至千亿级别的深度学习模型。这类模型能够处理更加复杂的任务&#xff0c;并在各项基准测试中取得了优异的成绩。大模型在自然语言处理、计算机视觉、推荐系统等领域都取得了显著的成果。 大模型的主要优势在于其强大的表征能力&…

k8s的核心组件etcd功能详解【含etcd各类参数详细说明】

etcd 是 Kubernetes 中的一个关键组件&#xff0c;用于存储集群的配置信息、状态和元数据。它通常作为 Kubernetes 集群的数据存储后端&#xff0c;为其他组件提供可靠的分布式键值存储服务。下面我会详细介绍 etcd 的功能以及常见的参数&#xff0c;以及如何配置和使用 etcd。…

Linux实验 Shell编程

实验目的&#xff1a; 熟练掌握Shell程序的建立与执行&#xff1b;掌握Shell变量的两种类型&#xff08;Shell环境变量和用户自定义变量&#xff09;及其用法&#xff1b;掌握Shell中的特殊字符、算术与逻辑运算&#xff1b;掌握Shell中输入输出命令&#xff1b;掌握Shell程序…