我很难理解Scott编程语言语言学中的自旋锁。感谢您能否更清楚地解释它们。感谢。
虽然所有这些算法在历史上都很重要,但却很实用 自旋锁需要在恒定的时间和空间中运行,对于这个 需要一个不仅仅是加载或存储的原子指令。 从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?
为什么它可以作为旋转锁?
实际上,在循环中嵌入 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
?
这种方式比第一种更好?
答案 0 :(得分:3)
当锁定空闲时,L的值是什么意思?
L
设置为0,如果锁定被某人锁定,则设置为1。
当且仅当L为真时,test_and_set(L)是否返回false?
是的,它在您引用的引文中有明确描述:“返回该变量之前是否为假的指示”。
为什么它可以作为旋转锁?
它满足上述变量L
的不变量。
“普通读取(加载)指令”是指L?
时读取L in的指令
是
这种方式比第一种更好?
通过“普通读取”指令检查L
为0比使用test_and_set
指令在多核或多处理器机器上涉及的通信量少“。因此,当一个核心在锁定锁上旋转时,其他核心受影响较小。