今天来看一下独占访问(Exclusive Accesses)。
什么是独占访问呢?就是处理器对某个内存地址的数据,在某个时间段内享有独有的访问。为什么要有独占访问,或者说何时需要独占访问呢?举个简单例子,假设在银行的服务器上,一个进程负责处理某个用户的账户余额,如果别的进程也来修改这段的数据,那么就需要一定的机制保证这段数据不会乱掉。直观的想法,就是给这段数据加上“锁”,只有“锁”的拥有者才有访问权限。当拥有者访问完毕后,需要去掉“锁”,这样别的处理器/进程可以继续访问。“锁”的形式有很多种,有很多文章在研究,感兴趣的同学可以去搜搜。
其中一个比较常见的算法是CAS(Compare And Set),顾名思义,就是读出某段内存地址的数据,如果跟期望值一样,那么就改写该数据,如果与期望值不一样,就认为此次操作失败。对应到处理器端的操作,最简单的机制是先读出数据,计算新的数据值,再次读出该地址数据,如果与第一次读出的值一样,就认为这段时间内没有其它访问,可以把新数据写回,完成此次操作;如果第二次读出的数据与第一次读出的数据值不一样,就认为在这段时间内该数据肯定被其它进程修改过,此次操作失败。
细心的同学可以从上面的描述中看出,这种算法偏乐观了,在实际应用中,有一个很大的问题,那就是比较有名的ABA问题。来看下面的例子:
- 进程a读取地址X的数据,得到数据值A,并进行新值计算;
- 进程b把地址X的数据值改为B,随即又改回A;
- 进程a再次读取地址X的数据,得到数据值A,与第一次的数据值比较,发现一样,把新值写回。
在进程a的操作过程中,地址X的数据经历了A->B->A的过程,但是进程a并不知道!为了解决ABA问题,有很多人研究出不少方法,此处篇幅有限,不展开讨论。说了半天,其实就是为了解释一下独占访问。
A系列处理器为了支持CAS,有相关的指令,叫LDREX和STREX。需要说一下的是,LDREX和STREX是对内存中的一个字(Word,32bit)进行独占访问的指令。如果想独占访问的内存区域不是一个字,还有其它的指令,LDREXB和STREXB是对内存中的一个字节(Byte,8 bit)进行独占访问;LDREXH和STREXH是对内存中的一个半字(Half Word,16 bit)进行独占访问;LDREXD和STREXD是对内存中的一个双字(Double Word,64 bit)进行独占访问。它们必须配对使用,不能混用。如果大家想学关于exclusive load和exclusive store更多的知识,可以上网去搜一下关于MIPS的load-link(ll)和store-conditional(sc),应该能找到更多的文章。
不扯太远,书归正题。在CHI协议中,独占访问的原则是,需要独占访问的逻辑处理器(logical processor,LP)需要完成下列操作:
- 执行对一个地址的Exclusive Load;
- 对该地址的数据进行计算;
- 执行对该地址的Exclusive Store;
CHI支持两种形式的独占访问:
- 对Snoopable内存地址的独占访问;
- 对Non-snoopable内存地址的独占访问;
为了实现独占访问,ARM系统中还特别提供了“独占监视器(Exclusive Monitor)”。Monitor的位置,以及为支持独占访问而生成的请求类型,取决于地址的内存属性。对于snoopable的内存地址,需要采用两个monitors:
LPmonitor:RN-F内的每个LP都必须实现一个exclusive monitor,用于监控一个独占序列(exclusive sequence)的地址信息。LP在执行Exclusive Load时,LP monitor会置位;LP monitor在下面情况会复位:
LP收到相同地址的无效snoop请求,表明该地址已经被其它LP更新了。
同一个LP对该地址产生的store操作。如果store是由同一个LP采用非独占命令产生的,那么LP monitor是否复位是由实现具体决定的。
- PoCmonitor:HN-F必须实现一个PoC monitor,用于判定Exclusive Store事务的结果是成功还是失败。如果成功,表明该transaction已经对其它一致性RN-F节点可见。如果失败,表明该transaction没有对其它一致性RN-F节点可见,因此Exclusive Store不能成功。对PoC monitor的最低要求就是它能记录任何LP何时执行与独占序列相关的Snoopable事务。PoC monitor必须能够支持对系统中所有具有独占功能的LP进行并行监控。当HN-F从某个LP收到一笔和Exclusive Load或Exclusive Store相关的transaction后,PoC monitor会记录该LP正尝试进行一个独占序列操作。若是HN-F收到一笔Exclusive Store,如果PoC monitor已注册该LP正在执行排他序列,即它没有被来自另一个LP的排他存储事务重置,则排他存储事务成功并被允许继续。在这种情况下,必须重置所有其他LP的注册尝试;如果PoC monitor并未注册该LP正在执行独占序列,即它已被另一个LP的独占存储重置,则独占存储事务失败,不允许继续。监视器必须注册LP正在尝试的独占序列。
对于Non-snoopable内存地址空间,使用一个monitor:
- System monitor:系统监视器会跟踪对Non-snoopable地址空间的独占访问。系统监视器接收到ReadNoSnp(Excl)事务后会置位,也会被其它同地址LP的改写而复位。系统监视器可以放置于PoS或终端设备处。考虑到系统中终端设备的数量比PoS的数目多,将System monitor放置于PoS处可以:减少系统监视器的重复,同时也可以减少系统检测独占访问失败的时间。系统监视器必须放置于可以观测到所有transactions的地方。
下面这些transactions可以使用Excl bit来支持独占访问:
- Exclusive Load transaction to a Snoopable location:
ReadClean. - ReadNotSharedDirty.
ReadShared. - Exclusive Store transaction to a Snoopable location:
CleanUnique. - Exclusive Load transaction to a Non-snoopable location:
ReadNoSnp. - Exclusive Store transaction to a Non-snoopable location:
WriteNoSnp.
下面的表格是spec给出的request的snoopable属性,相关监视器类型以及失败条件和响应要求的可能原因。
Spec中的6.3.3章节对Snoopable位置的独占访问进行了详细的解释,这里就不再翻译赘述了。
作者:老秦谈芯
来源:https://mp.weixin.qq.com/s/zYhl4aLcd1AaXp7_o8hlDA
微信公众号:
相关文章推荐
更多AMBA协议相关知识请关注</span>Arm AMBA 协议集专栏。