acquire() 和 release() 锁定操作与 testandset()

acquire() and release() lock operations with testandset()

我需要解决以下问题:

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

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

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

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

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

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

在 testAndSet wiki 上找到:

锁的四个主要评估指标通常是无竞争锁获取延迟、总线流量、公平性和存储。

其中两项的测试和设置分数较低,即高总线流量和不公平性。

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

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

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