1. 前言
当多个PE或1个PE的多个线程,可能会并行访问共享内存空间,那么就容易造成数据踩踏,造成数据丢失。因此需要一种机制实现多个访问能互斥的进行访问共享内存空间,确保在同一时刻只有1个request可以改写数据。在software层面上可以用一些flag来握手。在hardware层面上,不同的architecture也进入了一些同步机制来达成。
Arm architecture中给共享内存空间(shared memory)提供了非阻塞的synchronization同步机制。非阻塞指的是多个PE可以共同去抢占shared memory。对于任意的memory空间(Normal或Device),都可以进行采用synchronization同步机制。下表列出了A64指令集中提供的synchronization指令。
上表中除了CLREX,其它每一行的两条指令都是load-exclusive和store-exclusive对,也就是它们是配对使用的。我们以访问地址ABC为例,来讲述load-exclusive和store-exclusive的模型。
- 首先observer先发起1笔load-exclusive指令去访问地址ABC。
- observer对读到的数据进行操作。
- observer发起对应的store-exclusive指令去写地址ABC。如果ABC还没有被其它observers或线程写过,那么这次的写就会成功。反之,就失败了。store-exclusive指令会返回1-bit的状态指示memory写是否成功。
load-exclusive在访问的时候,会把一小块memory空间标记为"exclusive access",这块memory空间的大小是IMPLEMENTATION DEFINED的,范围在4-512 word。通过查询CTR_EL0的ERG(Exclusives reservation granule)域段就可以知道了。
2. Exclusive访问Non-shareable memory locations
对于Non-shareable属性(shareability attribute)的memory地址,exclusive指令的访问依赖于load exclusive monitor或local monitor。这个monitor会将load-exclusive指令访问的address打标记,并且转换到"Exclusive Access"状态。后续同一个observer的store-exclusive指令对该address的数据修改要保证把这个标记清理掉,也就跳转到"Open Access"状态。对于exclusive指令对local monitor状态机影响如下:
一旦local monitor进入Exclusive Access状态,只有store/storeexcl或CLREX才能让它跳转回Open Access状态。且如果store-exclusive不管有没有成功执行了,那么monitor一定要跳回Open Access状态。因此,执行store-exclusive时,可能会有以下几个结果:
如果monitor为Exclusive Access状态,其它非exclusive的同PA地址的store access执行了,那么monitor是否跳回Open Access状态,是IMPLEMENTATION DEFINE的,不管这个store access是本PE,还是其它observer。
3. Exclusive访问Shareable memory locations
shareable memory地址指的是这部分空间它的shareability attribute是或者被认为是Inner shareable或outer shareable的。
shareable memory空间的exclusive access访问,除了受到local monitor的检查,也要受到global monitor的检查。local monitor顾名思义就是监测observer内部的access,对其它PE或observer的access是不关心的。这就需要global monitor来一同把关exclusive access是否可以成功。
global monitor也是在看到有load-exclusive访问的时候,把对应的PA标记为Exclusive Access,它用于决定后续的该PE的store-exclusive对该PA操作是否可以成功。另外,其它PE如果对该PA成功地执行了store-exclusive,那么所有其它PE对该PA的标记都会被清掉,变成Open Access状态。对于每个PE,architecture只要求global monitor支持1个marked address就行了。
global monitor可以位于PE内部,也可以位于memory interface上作为二级monitor。如果某个模块可以同时具有global monitor和local monitor的功能,那么就相当于这个模块将global monitor和local monitor合在一起了。
如果一笔write操作是由无法产生exclusive或其它atomic机制的非PE类型observers=引起的,它对Arm PEs的local monitor和global monitor的影响是IMPLEMENTATION DEFINED的。
load exclusive
对于1个PE来说,对shareable memory空间执行load exclusive指令有两方面影响:
- load exclusive对应PA的块会被标记为Exclusive access
- 同一个PE之前对其它PA的exclusive access状态的标记会被清掉,也就是说global monitor对1个PE只支持记录1个outstanding的exclusive access。
1个PE的load exclusive指令对任何其它PE都不应该有影响。
store exclusive
store exclusive会根据具体情况来更新memory。如下:
在一个sharead memory系统中,global monitor对每个能产生exclusive操作的observer都需要实现1个单独的exclusive状态机。这些单独的状态机除了受自己observer的影响,也会被其它observer影响。
当1个PE的global monitor状态从Exclusive access变到Open access时,需要生成1个event并保存在该PE的event register中。这个event register是被WFE机制使用的。
global monitor的对PE(n)的状态机跳转如下:
4. Context switch support
Exception return会清除掉local monitor,使它回到Open Access状态。因此,在大多数情况下,在context switch时,并不需要执行CLREX指令。context switch并不是application层面的操作,是OS等high EL级别进行的操作。