如何理解自旋锁的这些实现?

时间:2017-08-30 17:56:06

标签: concurrency synchronization programming-languages computer-science

我很难理解Scott编程语言语言学中的自旋锁。感谢您能否更清楚地解释它们。感谢。

  1.   

    虽然所有这些算法在历史上都很重要,但却很实用   自旋锁需要在恒定的时间和空间中运行,对于这个   需要一个不仅仅是加载或存储的原子指令。   从20世纪60年代开始,硬件设计师开始装备他们的   具有读取,修改和写入存储器的指令的处理器   位置作为单个原子操作。最简单的这样的指示   被称为test_and_set。它将布尔变量设置为true和   返回变量先前是否为false的指示。   给定test_and_set,获取自旋锁几乎是微不足道的:

    while not test_and_set(L)
        –– nothing –– spin
    

    L的价值是什么意思?

    当且仅当test_and_set(L)为真时,L是否会返回false?

    为什么它可以作为旋转锁?

  2.   

    实际上,在循环中嵌入 test_and_set 往往会导致   在多核或多处理器上进行不可接受的通信量   机器,因为缓存一致性机制试图协调写入   由多个核试图获取锁。这个过度需求   硬件资源被称为争用,并且是一个主要障碍   在大型机器上表现良好。

         

    为了减少争用,通常是同步库的编写者   使用 test-and-test_and_set lock ,它与普通读取一起旋转   (满意的是缓存)直到看起来锁是免费的(见   图13.8)。当一个线程释放一个锁时,仍然会有一个   当等待线程执行它们时,总线或互连活动的混乱   test_and_sets,但至少这个活动只发生在   关键部分的边界。在大型机器上,争用可以   通过实施退避策略进一步减少,其中包含一个线程   尝试获取锁定不成功等待一段时间   再试一次。

    type lock = Boolean := false;
    procedure acquire lock(ref L : lock)
        while not test and set(L)
            while L
                –– nothing –– spin
    procedure release lock(ref L : lock)
        L := false
    
         

    图13.8一个简单的test-and-test_and_set锁。等待过程   使用普通读取(加载)指令旋转,直到出现锁定   是免费的,然后使用test_and_set获取它。第一次访问是   一个test_and_set,用于普通(无竞争)情况下的速度。

    “普通读(加载)指令”是否指的是指令 阅读L中的while L

    这种方式比第一种更好?

1 个答案:

答案 0 :(得分:3)

  

L的值是什么意思?

当锁定空闲时,

L设置为0,如果锁定被某人锁定,则设置为1。

  

当且仅当L为真时,test_and_set(L)是否返回false?

是的,它在您引用的引文中有明确描述:“返回该变量之前是否为假的指示”。

  

为什么它可以作为旋转锁?

它满足上述变量L的不变量。

  

“普通读取(加载)指令”是指L?

时读取L in的指令

  

这种方式比第一种更好?

通过“普通读取”指令检查L为0比使用test_and_set指令在多核或多处理器机器上涉及的通信量少“。因此,当一个核心在锁定锁上旋转时,其他核心受影响较小。