ARMv8-A 缓存一致性(2)
一、ARMv8-A 架构的原子性
原子性是访存行为的一个特征,我们一般称具有原子性的访存操作为原子性操作。ARMv8-A 架构有两种原子性,一种是单拷贝原子性(single-copy atomicity),另一种是多拷贝原子性(multi-copy atomicity)。
观察者是指系统能观察到访存行为的主体,可以是进程或线程等。但更具体地说,在 ARMv8-A 架构中,观察者的具体含义为:
可以读写存储系统的机制;
可以取指令或填充指令缓存的机制,这些操作被视为读操作;
可以遍历转换表的机制,这些操作也被视为读操作。
当满足如下条件时,一个读或写的访存行为是单拷贝原子性的:
当对一个内存位置进行一系列写操作后,这个内存位置的值只能是这一系列写操作中一个写操作所写的值,而不可能部分来自于一个写操作,部分来自于另一个;
当一个读操作和一个写操作共同作用于一个内存位置时,读操作读到的值要么是写操作发生之前该内存位置的值,要么是写操作之后该内存位置的值,而不会部分是写之前的值,部分是写之后的值。
在一个多处理器系统中,当对一个内存位置的写操作同时满足如下两个条件时该写操作是满足多拷贝原子性的:
多个写操作是序列化的。这就是说这些写操作的顺序对所有的能观察到它们的观察者来说是一致的,尽管有些观察者可能只能看到部分的写操作;
在一个写操作的观察者都观察到该写操作之前,对该写操作所作用的内存位置的读操作不能返回值。
满足多拷贝原子性是写操作满足存储一致性的必要条件。
二、ARMv8-A 架构的访存顺序
如果对一个内存位置的访问存在地址依赖关系(读与读之间或读与写之间),那么这些访存行为应该以程序顺序被 shareability domain shareability domain 在第二十二期《02-ARMv8-A存储模型概述》中可以查到,它是满足一定规则的处理器的集合)中的观察者观察到(ARMv8架构对于第二个读是由 Load Non-Temporal Pair instruction 发起时放松了这条规定);
如果一个读操作和一个写操作之间存在着控制、地址和数据依赖关系,那么在shareabilitydomain中的观察者看到的应该都是程序顺序的内存访问;
访存顺序可以由 DMB指令和DSB指令控制。
ARM架构支持弱一致性模型,memory barrier 是一条或一段能在处理器的 load/store 指令之间造成同步事件的指令的总称。ARMv8 架构支持一系列 barrier 指令:
Instruction Synchronization Barrier(ISB);
Data Memory Barrier(DMB);
Data Synchronization Barrier(DSB);
为了了解这些指令的作用,我们首先了解一下读写操作完成的含义。一个shareability domain 中的读写操作完成,需要满足以下两个条件:
读写操作应该被这个 shareability domain 的全局观察到;
与这个读写操作相关的转换表遍历操作应该被 shareability domain 中的处理器观察到,并且 TLB 被更新;
SB 指令可以刷新处理器中的流水线,从而程序顺序里在 ISB 之后的指令只有在 ISB 指令执行完成之后才能从主存或缓存中取出,从而保证 ISB 指令之前的指令都执行完成后才能执行其后的指令。
DMB 指令[4]为数据存储器隔离指令,该指令保证当所有在它前面的存储器访问操作都执行完毕后,才提交(commit)在它后面的存储器访问操作。处理器中的提交操作一般用于使所提交的操作能更改机器状态,如存储器状态。
DSB 指令[4]为数据同步屏障指令,该指令比 DMB 指令更加严格,它确保它前面的存储器访问操作都执行完毕后,才执行在它后面的指令。
三、结语
本期我们考察了 ARMv8-A 架构的原子性和访存顺序,下一期中我们分析一下 openEuler 的汇编语言。
- 点赞
- 收藏
- 关注作者
评论(0)