【问题标题】:Load-Acquire/Store-Release and interrupts加载-获取/存储-释放和中断
【发布时间】:2020-01-16 15:09:31
【问题描述】:

假设我有一个原子加载-修改-存储操作:

1:    ldaxr x8, [x9]
      orr x10, x8, #1
      stlxr w11, x10, [x9]
      cbnz w11, 1b

如果我理解正确的话,当这段代码在两个内核上执行(访问相同的内存地址)时,线程 A 会使用ldaxr 锁定资源。线程 B 中的stlxr 失败并重试操作,直到线程 A 释放锁。

但是如果在主线程中的ldaxr 之后发生中断并且中断处理程序尝试访问相同的内存地址会发生什么?是死锁还是中断处理程序优先,主线程中的stlxr从中断返回时会失败?

【问题讨论】:

    标签: assembly arm64 lock-free armv8


    【解决方案1】:

    主线程中的stlxr会失败。
    ldaxrstlxrLoad-link/Store-conditional指令,它们是无锁的,用户必须准备好重复LL/SC。

    每当使用 Load Exclusive 指令读取地址时,它都会被标记为用于 独家访问。如果使用 Store Exclusive 指令写入标记为独占的地址, 它清除了独占状态。尝试写入未标记为独占的地址 存储独占指令不会成功。这使软件能够检测该内容是否 自上次读取以来地址已更改。

    【讨论】:

    • 我可以让你在 25,000 个高原中只差一点点赞,哈哈 ;-)
    • @MichaelPetch 我最近为此更加活跃,我必须承认 :)
    • 我注意到了,很好奇哈哈
    • 恭喜 MB ;-)
    【解决方案2】:

    主代码的存储指令成功码将指示失败。

    从广义上讲,跨处理器架构,这些工作方式取决于处理器。然而,我相信有一些实施策略会奏效。处理器可以在中断时取消保留(这意味着它永远不必在上下文切换时保存/恢复保留状态),或者可以等到另一个 ldaxr 完成后再取消保留,或者可以等到另一个 @987654323 @ 在同一缓存行或同一地址完成。使用某些方法,处理器将存储保留的位置/地址,而在其他方法(即可能是单核)中,它不一定必须(除非它想要验证 ld/st 对的正确使用,这应该在地址和访问大小上匹配)。

    来自ARM manual,pg B-165 状态:

    B.6.5 Load-Exclusive 和 Store-Exclusive 指令约束:

    如果在没有中间 LoadExcl 指令的情况下执行了两个 StoreExcl 指令,则第二个 StoreExcl 指令返回状态值 1。

    ...更多细节...

    (1为失败码,0为成功码。)

    因此,根据该文本,如果处理器在中断期间执行这样的存储,这将取消任何获得的保留,从而使主代码的存储失败,而不管所涉及的内存地址如何。

    虽然指令集的架构要求通常是相当具体的,但可以实施各种具有不同权衡的替代策略来实现这一点。

    【讨论】:

      猜你喜欢
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 2013-02-16
      • 1970-01-01
      相关资源
      最近更新 更多