原子操作与锁

news2025/1/4 20:05:51

1 原子性

1.1 CPU缓存

在这里插入图片描述

L1、L2:一级缓存、二级缓存,均为核心独有
L3:三级缓存,多个核心共用

多级缓存,弥补CPU与内存速度不匹配的问题

1.2 cache line

缓存进行管理的一个最小存储单元,缓存块

在这里插入图片描述

1.3 CPU读写数据

写直达策略

缓存中任何一个字节的修改,都会立刻传播到内存

效率很低

写回策略

写操作:

  • 首先判断是否命中缓存,若命中,直接写在缓存中,并标记为脏数据
  • 若没有命中缓存,则通过LRU算法定位一块新的缓存块,若其为脏数据,则刷到主存,并写入新的数据,标记为脏;若不为脏数据,则直接写入新的数据,标记为

读操作:

  • 首先判断是否命中缓存,命中直接返回
  • 若没有命中缓存,则通过LRU算法定位一块新的缓存块,若其为脏数据,则刷到主存,并写入新的数据,标记为非脏;若不为脏数据,则直接写入新的数据,标记为非脏

对于多个核心的情况下,写回策略存在问题:

假如一个处理器有两个核心,分别是A、B,A中写入i=10,此时内存中的数据为i=5,此时B读取数据,B直接从内存中获取数据,获取到i=5,即读到了不一致的数据

写传播 & 事务串行化

为了解决上述问题,提出了写传播事务串行化

写传播:
在处理器1中的A核心的操作,可以传播到B核心和其他处理器中。

主要是通过总线嗅探bus snooping的方式,即监听是否有数据变的。

事务串行化:
多个处理器对同一个值进行修改,在同一时刻只能有一个处理器写成功,必须保证写操作的原子性,多个写操作必须串行执行。

主要是通过lock指令来实现。

MESI协议

上述写传播中,我们并不需要把数据广播到所有处理器中,因为有时候用不上,所以提出了MESI协议。

主要原理:通过总线嗅探策略(将读写请求通过总线广播给所有核心,核心根据本地状态进行响应)

状态:

  • Modified(M):已修改,某数据已修改但是没有同步到内存中。如果其他核心要读该数据,需要将该数据从缓存同步到内存中,并将状态转为 S。
  • Exclusive(E):某数据只在该核心当中,此时缓存和内存中的数据一致。
  • Shared(S):某数据在多个核心中,此时缓存和内存中的数据一致。
  • Invaliddate(I):某数据在该核心中以失效,不是最新数据。

事件:

  • PrRd:核心请求从缓存块中读出数据; Process Read
  • PrWr:核心请求向缓存块写入数据;
  • BusRd:总线嗅探器收到来自其他核心的读出缓存请求;
  • BusRdX:总线嗅探器收到另一核心写⼀个其不拥有的缓存块的请求;
  • BusUpgr:总线嗅探器收到另一核心写⼀个其拥有的缓存块的请求;
  • Flush:总线嗅探器收到另一核心把一个缓存块写回到主存的请求;
  • FlushOpt:总线嗅探器收到一个缓存块被放置在总线以提供给另一核心的请求,和 Flush 类似,但只不过是从缓存到缓存的传输请求。

状态机:
在这里插入图片描述

写后锁住ME状态,避免相关内存的访问

1.4 原子性的实现

原子操作:多线程环境下,确保对共享变量的操作在执行时不会被干扰,从而避免竞态条件。

对于多处理器多核心,要保证原子性:

  • 操作指令不被打断(关中断)
  • lock指令只需阻止其他核心对相关内存空间的访问
  • MESI协议

2 锁

2.1 互斥锁

独占锁,当线程A获得锁后,线程B无法获得锁,只有A释放锁后才能获得锁。

互斥锁在被占用时,其他线程先在用户态自旋一会,若获取锁失败,会任务挂起,进入阻塞队列(内核中)。

锁释放后,线程从阻塞队列中取出,转换为就绪态。

2.2 自旋锁

自旋锁在发生资源冲突时,原地等待,转换为就绪态。

2.3 原子变量

  • std::atomic<T>:声明原子变量
  • is_lock_free:是否支持无锁操作,只有atomic_flag是无锁操作,只有true或flag,对应一个字节
  • store(T desired, std::memory_order order) :用于将指定的值存储到原子对象中
  • load(std::memory_order order):用于获取原子变量的当前值
  • exchange(std::atomic<T>* obj, T desired)obj参数指向需要替换值的atomic对象,desired参数为期望替换成的值。如果替换成功,则返回原来的值。
  • compare_exchange_weak(T& expected, T val, memory_order success, memory_order failure) :比较一个值和一个期望值是否相等,如果相等则将该值替换成一个新值,并返回 true;否则不做任何操作并返回 false。
    注意,compare_exchange_weak 函数是一个弱化版本的原子操作函数,因为在某些平台上它可能会失败并重试。如果需要保证严格的原子性,则应该使用 compare_exchange_strong 函数。
  • compare_exchange_strong(T& expected, T val, memory_order success, memory_order failure)

3 内存序

由于编译器有时候会对指令进行优化重排,CPU也会对指令进行重排,但有时候可能产生问题。

内存序规定了多个线程访问同一个内存地址时的语义

  • 某个线程对内存地址的更新何时能被其它线程看见
  • 某个线程对内存地址访问附近可以做怎么样的优化

memory_order_relaxed

松散内存序,只用来保证对原子对象的操作是原子的,在不需要保证顺序时使用

在这里插入图片描述

memory_order_release

在写入某原子对象时,当前线程的任何前面的读写操作都不允许重排到这个操作的后面去

在这里插入图片描述

memory_order_acquire

在读取某原子对象时,当前线程的任何后面的读写操作都不允许重排到这个操作的前面去

在这里插入图片描述

memory_order_acq_rel

一个读‐修改‐写操作同时具有获得语义和释放语义,即它前后的任何读写操作都不允许重排

memory_order_seq_cst

顺序一致性语义

对于读操作相当于获得,对于写操作相当于释放,对于读‐修改‐写操作相当于获得释放

是所有原子操作的默认内存序,并且会对所有使用此模型的原子操作建立一个全局顺序,保证了多个原子变量的操作在所有线程里观察到的操作顺序相同,当然它是最慢的同步模型。

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

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

相关文章

【xilinx】解决 I/O 时钟布局器错误:CLOCK_DEDICATED_ROUTE 异常示例

问题描述 设备&#xff1a; xcvm1102-sfva784-2HP-iS问题&#xff1a;尽管使用 GCIO 引脚作为时钟&#xff0c;但布局器返回 I/O 时钟错误 错误&#xff1a; <span style"background-color:#f3f3f3"><span style"color:#333333"><code&g…

《机器学习》 贝叶斯分类器 原理、参数讲解及代码演示

目录 一、贝叶斯算法 1、简介 2、贝叶斯算法具有以下特点&#xff1a; 二、贝叶斯原理 1、正向概率&#xff08;先验概率&#xff09; 例如&#xff1a; 2、逆向概率&#xff08;后验概率&#xff09; 3、公式 1&#xff09;实例1 2&#xff09;实例2 • 目标&#x…

基于初始运行数据的电池循环寿命预测

这个例子展示了如何使用线性回归(一种监督机器学习算法)预测快速充电锂离子电池的剩余循环寿命。使用基于物理的建模方法预测锂离子电池的循环寿命是非常复杂的&#xff0c;因为不同的操作条件和显著的设备可变性&#xff0c;即使是来自同一制造商的电池。对于这种情况&#xf…

FPGA上板项目(四)——FIFO测试

目录 实验内容实验原理FIFO IP 核时序绘制HDL 代码仿真综合实现上板测试 实验内容 理解 FIFO 原理调用 FIFO IP 核完成数据读写 实验原理 FIFO&#xff1a;First In First Out&#xff0c;先入先出式数据缓冲器&#xff0c;用来实现数据先入先出的读写方式。可分类为同步 FI…

论文翻译 | 通过逻辑增强大型语言模型中的零样本思维链推理

摘要 大型语言模型的最新进展已经展示了它们在各个领域的卓越泛化性。然而&#xff0c;他们的推理能力仍有很大的提高空间&#xff0c;特别是在面对需要多步骤推理的场景时。虽然大型语言模型拥有广泛的知识&#xff0c;但它们的推理往往不能有效地利用这些知识来建立连贯的思维…

机器学习/数据分析--通俗语言带你入门决策树(结合分类和回归案例)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 机器学习是深度学习和数据分析的基础&#xff0c;接下来将更新常见的机器学习算法注意&#xff1a;在打数学建模比赛中&#xff0c;机器学习用的也很多&a…

[LeetCode]根据决策树设计代码解决dfs

目录 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 决策树&#xff1a;根据题意可以知道&#xff0c;全排列需要找到数组内元素不重复的所有排列方式&#xff0c…

Java面向接口编程——开发打印机

题目&#xff1a; 墨盒&#xff1a;彩色、黑白 纸张类型&#xff1a;A4、B5 墨盒和纸张都不是打印机厂商提供的 打印机厂商要兼容市场上的墨盒、纸张 墨盒接口&#xff1a; public interface InkBox {String colorInkBox(); // 墨盒颜色} 纸张接口&#xff1a; public i…

Centos 添加双网卡 (生产环境配置记录)

1、在虚拟机中添加网卡2 [rootntpserver network-scripts]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo …

前端(Vue)tagsView(子标签页视图切换) 原理及通用解决方案

文章目录 tagsView 方案总结tagsView 原理分析创建 tags 数据源生成 tagsViewtagsView 国际化处理contextMenu 展示处理contextMenu 事件处理处理 contextMenu 的关闭行为处理基于路由的动态过渡 tagsView 方案总结 整个 tagsView 整体来看就是三块大的内容&#xff1a; tags…

【SAM下游任务微调】TS-SAM: Fine-Tuning Segment-Anything Model for Downstream Tasks

TS-SAM: Fine-Tuning Segment-Anything Model for Downstream Tasks 论文链接&#xff1a;https://arxiv.org/pdf/2408.01835 代码链接&#xff1a;https://github.com/maoyangou147/TS-SAM 一、摘要 基于适配器的微调方法已经被研究用于改进SAM在下游任务上的性能。然而&am…

【2024】Datawhale X 李宏毅苹果书 AI夏令营 Task1

本文是关于李宏毅苹果书“第1章 机器学习基础”学习内容的记录。 1、术语解释 术语解释机器学习&#xff08;Machine Learning, ML&#xff09;机器学习是一种人工智能&#xff08;AI&#xff09;技术&#xff0c;它使计算机能够从数据中学习并做出决策或预测&#xff0c;而无…

【python计算机视觉编程——3.图像到图像的映射】

python计算机视觉编程——3.图像到图像的映射 3.图像到图像的映射3.1 单应性变换3.1.1 直接线性变换算法&#xff08;DLT&#xff09;3.1.2 仿射变换 3.2 图像扭曲3.2.1 图像中的图像3.2.2 分段仿射扭曲3.2.3 图像配准 3.3 创建全景图3.3.1 RANSAC3.3.2 稳健的单应性矩阵估计3.…

【二叉树】LC405-删除二叉搜索树的节点

文章目录 1 删除二叉树的节点思路其他代码参考 1 删除二叉树的节点 https://leetcode.cn/problems/delete-node-in-a-bst/description/ 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。…

探索全球设计灵感:六大海外设计平台

海外设计网站对于设计师而言&#xff0c;不仅是灵感的源泉&#xff0c;更是专业成长的加速器。这些平台聚集了全球创意人士&#xff0c;提供了一个分享和发现最新设计趋势的环境。设计师可以通过这些网站学习行业内的创新技术&#xff0c;参与设计挑战&#xff0c;提升个人设计…

End-to-End视觉里程计新突破:从运动模糊图像中精确估计相机姿态

更多优质内容&#xff0c;请关注公众号&#xff1a;智驾机器人技术前线 1.论文信息 论文标题&#xff1a;MBRVO: A Blur Robust Visual Odometry Based on Motion Blurred Artifact Prior 作者&#xff1a;Jialu Zhang, Jituo Li*, Jiaqi Li, Yue Sun, Xinqi Liu, Zhi Zheng,…

饮水机复杂交互功能联网调试

饮水机复杂交互功能联网调试 引言 饮水机我们从最开始的放水和加热, 逐渐拓展到保温功能, 童锁功能, 红外检测功能, 对于这些复杂的交互功能, 我们如果通过按键进行调试, 会极大的增加我们的开发时间和成本, 如果我们频繁的进行烧录, 则如果涉及到一些中间变量, 则无法进行调试…

帆软BI怎么制作不等宽柱状图

帆软BI怎么制作不等宽柱状图 文章目录 帆软BI怎么制作不等宽柱状图不等宽柱状图起源一、怎么做不等宽柱状图准备二、操作步骤1.展示效果2.操作步骤-3.操作步骤 -图形属性4.操作步骤 -组件样式5.操作步骤 -横轴和纵轴6.完成7.不等宽柱状图与传统等宽柱状图对比 总结 不等宽柱状图…

【深度学习】嘿马深度学习笔记第5篇:神经网络与tf.keras,学习目标【附代码文档】

本教程的知识点为&#xff1a;深度学习介绍 1.1 深度学习与机器学习的区别 TensorFlow介绍 2.4 张量 2.4.1 张量(Tensor) 2.4.1.1 张量的类型 TensorFlow介绍 1.2 神经网络基础 1.2.1 Logistic回归 1.2.1.1 Logistic回归 TensorFlow介绍 总结 每日作业 神经网络与tf.keras 1.3 …

介绍云计算在医疗领域的应用实例

云计算在医疗领域的应用日益广泛&#xff0c;为医疗行业带来了诸多便利和创新。以下是几个典型的应用实例&#xff1a; 电子病历管理系统&#xff1a; 基于云计算技术的电子病历管理系统&#xff0c;通过互联网实现对病历数据的存储、管理、维护和查询等功能。这类系统能够自动…