【问题标题】:acquire() and release() lock operations with testandset()使用 testandset() 的 acquire() 和 release() 锁定操作
【发布时间】:2026-01-30 22:35:02
【问题描述】:

我需要解决以下问题:

一个。展示如何使用 TestandSet 指令实现acquire()和release()锁操作。

b.确定一个性能问题,当它在多处理器上运行时可能出现在您的解决方案中,但在单处理器上不会出现。描述出现性能问题的具体场景。

c。描述减少 b 中性能问题的替代锁实现,并解释它如何帮助您在 b 中提出的具体场景。

我的 acquire() 和 release() 设置如下:

acquire() {
    while(TestandSet(true)){
        //wait for lock to be released
    {
}
release() {
    TestandSet(false);
}

但是,我无法确定与多处理器或单处理器有关的任何性能问题。什么是性能问题?或者,我对 acquire() 和 release() 的实现是否正确?

【问题讨论】:

    标签: process operating-system thread-synchronization


    【解决方案1】:

    在 testAndSet wiki 上找到:

    一般来说,锁的四个主要评估指标是非竞争锁获取延迟、总线流量、公平性和存储。

    测试和设置在其中两个方面得分较低,即公交车流量大和不公平。

    当处理器 P1 已获得锁且处理器 P2 也在等待锁时,P2 将继续引发总线事务以尝试获取锁。当一个处理器获得锁时,所有其他也希望获得相同锁的处理器不断尝试通过反复启动总线事务来获得锁,直到它们获得锁为止。这显着增加了测试和设置的总线流量需求。这会减慢来自缓存和一致性未命中的所有其他流量。它减慢了整个部分的速度,因为流量因失败的锁定获取尝试而饱和。 Test-and-test-and-set 是对 TSL 的改进,因为它不会连续发起锁获取请求。

    当我们考虑公平性时,我们会考虑处理器在释放时是否有公平的机会获得锁。在极端情况下,处理器可能会饿死,即它可能无法在很长一段时间内获取锁,即使在这段时间内它已经空闲。

    TSL 的存储开销几乎为零,因为只需要一个锁。无竞争的延迟也很低,因为只需要一个原子指令和分支。

    【讨论】: