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

Concurrency 如何理解这些自旋锁的实现?,concurrency,synchronization,programming-languages,computer-science,Concurrency,Synchronization,Programming Languages,Computer Science,我很难从编程语言语用学(Scott)中理解自旋锁。如果您能更清楚地解释,我将不胜感激。谢谢 虽然所有这些算法在历史上都很重要,但实际上 自旋锁需要在恒定的时间和空间中运行,对于这个 需要一个原子指令,它的功能不仅仅是加载或存储。 从20世纪60年代开始,硬件设计师开始装备他们的 具有读取、修改和写入内存指令的处理器 作为单个原子操作的位置。最简单的指示 被称为测试和设置。它将布尔变量设置为true和true 返回变量以前是否为false的指示。 给定测试_和_集,获取自旋锁几乎是微不足道的:

我很难从编程语言语用学(Scott)中理解自旋锁。如果您能更清楚地解释,我将不胜感激。谢谢

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

    while not test_and_set(L)
        –– nothing –– spin
    
    L
    的值是什么意思

    当且仅当
    L
    为真时,
    test\u和\u set(L)
    是否返回false

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

  • 实际上,在循环中嵌入测试_和_集往往会导致 多核或多处理器上不可接受的通信量 当缓存一致性机制尝试协调写入时 通过多个内核尝试获取锁。这要求太高了 硬件资源被称为争用,它是解决问题的主要障碍 在大型机器上性能良好

    为了减少争用,同步库的编写者经常 使用一个测试-测试和设置锁,它通过普通读取进行旋转 (被缓存满足)直到锁看起来是自由的(参见 图13.8)。当线程释放锁时,仍然会出现 等待线程执行其任务时总线或互连活动的流动 测试_和_集,但至少此活动只在 临界截面的边界。在大型计算机上,争用可能会发生 通过实施退避策略进一步降低了成本,其中线程 尝试获取锁失败的等待一段时间 在再试之前

    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_和_set获取它。第一次访问是 普通(无竞争)情况下的速度测试集

    “普通读取(加载)指令”是否指该指令 在
    中读取
    L
    ,而在
    中读取L

    这种方法如何比第一种更好

  • 我的价值是什么意思

    L
    在锁空闲时设置为0,在锁被人锁定时设置为1

    当且仅当L为真时,测试_和_集(L)是否返回false

    是的,在您提到的引文中有明确描述:“返回变量以前是否为假的指示”

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

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

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

    这种方法如何比第一种更好

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