在互联总线里,"原子操作"与 "AxLOCK" ,exclusive不是并列概念,而是 "同一机制的不同实现方式"。
1.atmotic原子操作
原子操作 指的是不可被中断的、最小的操作单元 ------ 它要么完整执行完毕,要么完全不执行,不存在 "执行了一半" 的中间状态。
对于总线来说,基本的原子操作有原子读,原子写,原子读改写。
原子读:主要就是多transfer读中间不能被其他写打断或者更新。
-------比如读地址0~3,同时有写2~3发生,导致读0,1是旧值,2~3是新值。这就导致一个读被割裂了
原子写:主要是多transfer写过程中不要被其他读写操作打断。
-------如果在原子写过程中,出现有相同目标地址的读,只能全部读没写之前的状态,或等全部写完之后读。具体 取决于原子写的内存模型和硬件 / 语言的同步语义
-------如果在原子写过程中,出现有相同目标地址的写,这个写只能在原子写之前或之后。不会出现原子写0~3 abcd,其他写0~3 efgh,最终结果0~3为abgh,efcd这种交叉的情况
-------最终结果只能是abcd或者efgh。多线程环境下,两个原子写的执行顺序是不确定的(由 CPU 调度器决定),如果没有额外的同步机制(比如锁、内存屏障),无法预测最终结果。
-------也可以对两个原子写中先被仲裁的返回resp_ok,没被仲裁的返回resp_err
原子读改写:先读数据,在修改全部或者部分数据在写入原地址。在这个写完成之前不能有其他的操作修改内存。改数据可以在存储的远端也可以在存储的近端。如果是近端,读出来的数据就无需传到远端,节省带宽,减少延迟,但通常需要请求的时候把部分操作数传到近端
-------在axi5增加了原子操作的专用信号AWATOP, 直接定义 ADD/SWAP/CLR/SET/EOR 等操作。在此之前是没有专门的原子操作信号,但是可以利用axuser来传递这些信息。
2.axlock和exclusive
axi3及之前版本有2bit axlock:
00:normal
01:exclusive
10:locked
axi4及之后版本放弃了locked,只需1bit axlock
0:normal
1:exclusive
|---------------|--------------------------------------------------------------------------------------------------------------------------------------|----------------|------------------------------------------|
| Locked | 锁住目标地址 ,别的请求完全不能访问该 目标地址,直到解锁 可以是单独的locked read或write,如果不能返回失败 如获得lock,需要最后一笔trans以unlock解锁 | 低(阻塞访问该地址) | AXI3 遗留 ,现代设计已废弃 |
| Exclusive | 不锁总线 ,仅对目标地址设 monitor ; 后续写用 BRESP=EXOKAY/OKAY 告知"是否被别的主机踩过" 包含先Exclusive read+后Exclusive write两部分,其中一步失败,就认为Exclusive失败 | 高(仅冲突时重试) | AXI4/5 推荐 ,实现 spinlock、CAS、LL/SC |
显然Locked可以实现atmoic的读/写/读改写;Exclusive可以实现atmotic的读改写。