单片机 原子性操作_浅谈原子操作

本文探讨了原子操作在单片机中的实现,包括使用 Intel x86 架构的三种原子操作机制,并深入讨论了大粒度的原子操作,如加锁、COW 技术及其优化。文章还介绍了多对象原子操作和事务内存的概念,以及写日志在确保原子性中的应用。最终总结指出,无论方法如何变化,原子指令始终是实现原子操作的基础。
摘要由CSDN通过智能技术生成

导读:针对多个对象的原子操作,引入事务或者事务内存的概念,实际上的实现要么是写日志,要么是依赖于 COW 或加锁的方式,最终依赖于原子指令。

作者 | 子札

前言

所谓原子操作,就是要么不做,要么全做。在很多场景中,都有对原子操作的需求。在翻 aep 的 spec 文档时,也发现了一个巧妙的方法。所以顺便发散性地总结一下各种实现原子操作的方法,欢迎大家交流探讨。

小粒度——指令

根据 intel 手册卷三第八章的描述,x86 使用三种机制来实现原子操作:

1. Guaranteed atomic operations。Guaranteed atomic operations 是指一些基本的读写内存操作,这些操作都是保证原子性的。一般来说,读写位于一个 cache line 中的数据是原子性的。

2. bus lock,使用 LOCK# 信号和指令的 lock 前缀。锁总线的方式很简单,进行原子操作的 cpu 会在 bus 上 assert 一个 LOCK# 信号,此时其他 cpu 的操作都会被 block 住。

3. cache lock,利用 cache 一致性协议(MESI 协议)来实现。如果要访问的内存区域已经在当前 cpu 的 cache 中了,就会利用 cache 一致性协议来实现原子操作,否则会锁总线。

Intel 早期 cpu(如 Intel386、Intel486、奔腾处理器)实现原子操作,是通过 bus lock 来实现的。这种实现的问题,是完全不相关的两个 cpu 之间,也会相互竞争总线锁,从而导致整体性能下降。在后来的 cpu 中,intel 对这一问题进行了优化。当要进行原子操作的内存已经被拉入 cache 中时,cpu 会使用 cache 一致性协议来保证原子性,这被称为 cache lock。相比于 bus lock,cache lock 粒度更细,能获得更好的性能。

x86 中,有些指令是自带 lock 语义的,比如 XCHG,更新段描述符等等;另外一些指令可以手动加上 lock 前缀来实现 lock 语义,比如 BTS、BTR、CMPXCHG 指令。在这些指令中,最核心的当属 CAS(Compare And Swap)指令了,它是实现各种锁语义的核心指令。不同于自带原子语义的 XCHG,CAS 操作要通过"lock CMPXCHG"这样的形式来实现。一般而言,原子操作的数据长度不会超过 8 个字节,也不允许同时对两个内存地址进行 CAS 操作(如果可以的话,免锁双向链表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值