文章目录
一、独占访问指令和非共享内存区域
对于非共享内存区域,独占访问指令依赖于局部独占监视器,使用Load-Exclusive指令访问的地址会被它标记,使用同一个处理器并且不会被打断的Store-Exclusive指令将清除该标记。
一条Load-Exclusive指令把数据从内存加载到寄存器中,并且:
- 执行该指令的处理器将会把该地址标记为独占访问状态
- 该处理器的局部监视器也转变为独占状态
1.1 Store-Exclusive指令
Store-Exclusive会执行条件存储,这个条件取决于局部监视器的状态,该指令中还包含了保存状态值的寄存器。
1.1.1 如果局部监视器处于独占访问状态
- 并且Store-Exclusive指令的地址和监视器标记的地址相同,那么数据写入成功,否则数据是否写入取决于实现定义
- 状态值写入到寄存器中
- 如果写入成功返回0
- 否则返回1
- 执行该指令的处理器的局部监视器转换为开放访问状态
1.1.2 如果局部监视器处于开放访问状态
- 数据存储不会成功
- 状态值返回1
- 局部监视器保持开放访问状态
如果向标记地址写入数据的处理器和标记该地址的处理器不是同一个,写入数据是否会清除局部监视器中的标记由实现定义。
1.2 不同指令对局部监视器状态的影响
任何的Load-Exclusive操作都将更新标记的地址为地址x中最重要的位。
二、独占访问指令和共享内存区域
2.1 共享内存区域中独占访问
对于共享内存区域,独占访问依赖于:
- 系统中每个处理器的局部监视器,它保存了处理器执行Load-Exclusive指令之后的地址。对应的操作在已经在上一章描述过。
- 除此之外对于共享内存区域,使用Store-Exclusive指令的地址都会交给全局监视器检查,如果该地址符合上述章节中的描述,下面至少有一个操作被执行:
- 更新内存
- 返回状态值为0
- 本地监视器可以忽略其他处理器的访问
- 全局的监视器将标记一个地址为某一个处理器独占访问,这个标记用于稍后决定使用Store-Exclusive访问局部监视器中访问未失败的地址是否会发生数据写入。成功写入共享内存区域将会清除标记,对于系统中的处理器,全局的监视器:
- 可以容纳至少一个标记块
- 为每个标记块维护一个状态机
- 对于每个处理器,该架构只需要全局监视器支持单一的标记地址。
全局监视器可以存在于处理器中,在内存接口上作为辅助监视器存在,监视器的实现定义方面意味着全局监视器和本地监视器可以合并为一个单元。前提是该单元执行全局监视器和局部监视器定义的功能。
2.2 全局监视器的运行
Load-Exclusive指令从共享内存中加载数据,全局监视器将该地址标记为该处理器独占访问,该访问将会造成已经被该处理器标记的其他物理地址的独占标记被清除。
全局监视器只支持每个处理器对共享内存的单次独占访问。
一个处理器使用 Load-Exclusive 指令对其他处理器在全局监视器中的状态不会产生影响。
Store-Exclusive指令将会执行条件存储:
- 只有处理器把某个地址在全局监视器和局部监视器中标记为该处理器独占访问状态,存储数据保证成功,在这种情况下:
- 状态值0将会返回到寄存器中
- 对请求的处理器而言,全局监视器状态机的最终状态是由实现定义的。
- 如果该地址也被其他处理器标记为独占访问状态,那么全局监视器将会把这些标记清除,变为开放访问的状态。
- 如果没有被请求的处理器标记为独占访问状态,该存储不会成功:
- 状态值1将会返回到寄存器中,表明存储失败
- 全局监视器中该地址的状态不会被影响,仍然保持为开放访问状态。
- 如果全局监视器中该处理器将另外一个地址标记为独占访问状态,存储是否成功取决于实现定义:
- 如果存储成功返回0,否则返回1
- 如果在Store-Exclusive指令之前全局监视器中该地址的状态已经是独占访问状态,状态机是否会变成开放访问状态由实现定义决定。
- 全局监视器为每个处理器实现了单独的状态机,状态机可以对处理器访问共享内存做出反应。这意味着他将对如下行为做出回应:
- 处理器n的访问
- 其他处理器对共享内存区域的访问,标识为(!n)
全局监视器为每个处理器实现了一个状态机,状态机可以在系统中产生一条 Load-Exclusive 或者 Store-Exclusive 指令。
2.3 不同指令对全局监视器状态的影响
对于全局监视器的状态机:
- 该体系结构不需要load指令,这不是Load-Exclusive指令,不会对全局监视器产生任何影响。
- Store-Exclusive指令是否成功依赖于发出Store-Exclusive指令的地址和CPU与全局监视器中标记的地址是否匹配,以及局部监视器和全局监视器中是否处于独占状态
- Load-Exclusive指令可以将被标记的共享内存地址更新为Load-Exclusive指令中的地址。
- 当处理器处于独占状态时,CLREX指令是否会将全局监视器中的状态从独占访问变成开放访问,由实现定义。
- 以下由实现定义:
- 修改一个非共享内存区域,全局监视器是否会从独占状态转变为开放访问状态。
- 使用 Load-Exclusive 指令是否会从开放访问状态转换为独占访问状态。