假设我有一个原子负载-修改-存储操作:
1: ldaxr x8, [x9]
orr x10, x8, #1
stlxr w11, x10, [x9]
cbnz w11, 1b如果我正确地理解了这一点,当这段代码在两个核心上执行时(访问相同的内存地址),那么线程A会用ldaxr锁定资源。线程B中的stlxr失败,并重新尝试操作,直到线程A释放锁为止。
但是,如果在主线程和中断处理程序中的ldaxr试图访问相同的内存地址之后发生中断,会发生什么情况?它是死锁还是中断处理程序优先,主线程中的stlxr将在中断返回时失败?
发布于 2019-09-15 16:16:27
主线程中的stlxr将失败。
ldaxr和stlxr是负载链接/存储-条件指令,它们是无锁的,用户必须准备重复LL/SC。
每当使用Load独占指令读取地址时,都会将其标记为为独占访问。如果标记为独占的地址被写入使用Store独占指令,它将清除独占状态。使用Store独占指令写入未标记为独占的地址的尝试将不会成功。这使软件能够检测自上次读取地址以来,该地址的内容是否发生了更改。
发布于 2019-09-15 16:14:29
主代码的存储指令成功代码将指示失败。
从广义上讲,跨处理器体系结构,这些工作方式依赖于处理器。不过,我认为有许多实现策略是可行的。处理器可以在中断时取消保留(这意味着它永远不必在上下文切换时保存/恢复预订状态),或者可以等到另一个ldaxr完成时才取消保留,或者等到另一个ldaxr在相同的缓存线或相同的地址上完成。使用某些方法,处理器将存储保留的位置/地址,在其他方法中(可能是单个核心),它不一定非得这样做(除非它想验证ld/st对的正确用法,它应该在地址和访问大小上匹配)。
从这个臂手中,pg B-165声明:
B.6.5加载-独占和存储-独占指令约束: 如果两个StoreExcl指令在没有中间的LoadExcl指令的情况下被执行,则第二个StoreExcl指令返回状态值1。 ..。更多细节..。
(1是失败代码,0是成功代码。)
因此,通过该文本,如果处理器在中断期间执行这样的存储,这将取消任何获取的保留,从而使主代码的存储失败,不管涉及的内存地址是什么。
虽然指令集的体系结构需求通常是相当具体的,但是可以实现各种具有不同权衡的备选策略来实现这一点。
https://stackoverflow.com/questions/57945679
复制相似问题