58网站 做现浇混凝土,有没有专门做翻译的网站,杭州专业网站建设,网站建设需求表文章目录 概述LL/SC机制独占内存访问指令多字节独占内存访问指令 独占监视器经典自旋锁实现 LSE机制原子内存操作指令CAS指令交换指令 相关参考 概述
在编程中#xff0c;当多个处理器或线程访问共享数据#xff0c;并且至少有一个正在写入时#xff0c;操作必须是原子的当多个处理器或线程访问共享数据并且至少有一个正在写入时操作必须是原子的这意味着数据访问必须被视为相对于其他处理器的单个操作以避免数据竞争条件。
原子操作的实现依赖处理器硬件提供支持在不同的处理器体系结构上原子操作会有不同的实现例如在x86体系结构下通常使用锁缓存/总线的方式实现原子操作。目前在ARMv8体系结构下支持两种方式来实现原子操作
一种是经典的独占内存访问机制也叫做LL/SCLoad-Link/Store-Conditional早期ARM体系结构下的原子操作都是基于这种方式实现另一种是ARMv8.1体系结构上新增的LSELarge System Extension扩展LSE提供了多种原子内存访问操作指令。
LL/SC机制
LL/SC机制使用多个指令并且每个处理器都需要实现一个专有监视器LL/SC机制利用独占内存访问指令和独占监视器共同实现原子操作。首先看下ARMv8体系结构提供的独占内存访问指令。
独占内存访问指令
ARMv8体系结构实现的独占内存访问指令为LDXR/STXR
LDXR内存独占加载指令它从内存中以独占方式加载内存地址的值到寄存器中STXR内存独占存储指令它以独占的方式把数据存储到内存中。
LDXR/STXR的指令格式如下
ldxr xt, [xn | sp]
stxr ws, xt, [xn | sp]多字节独占内存访问指令
LDXP和STXP指令是多字节独占内存访问指令一条指令可以独占地加载和存储16字节。
ldxp xt1, xt2, [xn | sp]
stxp ws, xt1, xt2, [xn | sp]独占监视器
独占监视器是一个硬件状态机用于跟踪读-修改-写序列并支持Load和Store操作。当CPU执行LDXR指令时独占监视器会把对应内存地址标记为独占访问模式保证以独占的方式来访问这个内存地址而STXR是有条件的存储指令当CPU执行STRX指令将新数据写入到LDXR指令标记的独占访问内存地址时会根据独占监视器的状态来进行处理
若独占监视器为独占访问状态那么STRX指令执行成功并且独占监视器会切换状态到开放访问状态若独占监视器为开放访问状态则STRX指令执行失败数据无法存储。
ARMv8体系提供了三类独占监视器
本地独占监视器内部缓存一致性全局独占监视器外部全局独占监视器
这些独占监视器分别位于系统存储结构的不同层次如下
经典自旋锁实现
如下是一个经典的基于独占访问机制的自旋锁实现
LSE机制
LL/SC操作本质上是多个CPU核竞争某个内存变量的独占访问当系统处理器的数量很少时这可以正常工作当增加处理器的数量时处理器之间的竞争冲突会加剧这会严重影响系统系统再加上Cache的影响先前访问到内存变量的处理器会更容易再次获得变量的访问权这使得多核间访问变量的公平性也难以保证。
Armv8.1-A架构引入了新的原子操作指令即LSELSE机制用于替代原来的LL/SC机制。LSE提升了多处理器系统中原子操作的性能使用LSE可以在单个指令中提供不可中断的读-修改-写序列。原子指令可以在指定的内存位置上执行简单的算术或逻辑操作并将更新的值返回给处理器。LSE新增了三类指令
原子内存操作指令包含LDop和STop其中op可以是ADD、CLR、EOR、SET、SMAX、SMIN、UMAX和UMIN比较并交换指令包括CAS和CASP交换指令SWP
原子内存操作指令
原子内存操作指令分成两类原子加载指令和原子存储指令。原子内存访问指令的格式如下
ldop xs, xt, [xn|sp]
stop xs, [xn|sp]支持的原子操作后缀
CAS指令
CAS指令的格式如下
cas Ws, Wt, [Xn|SP{,#0}]
cas Xs, Xt, [Xn|SP{,#0}]casp Ws, W(s1), Wt, W(t1), [Xn|SP{,#0}]
casp Xs, X(s1), Xt, X(t1), [Xn|SP{,#0}]
交换指令
交换指令的指令格式如下
swp Ws, Wt, [Xn|SP]
swp Xs, Xt, [Xn|SP]相关参考
《ARM64体系结构编程与实践》《奔跑吧Linux内核》ARMv8.1平台下新添加原子操作指令Introduction to Large System Extensions