acquire()和release()使用testandset()锁定操作



我需要解决以下问题:

a。演示如何使用TestandSet指令实现acquire((和release((锁操作。

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

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

我的获取((和发布((设置如下:

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

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

在testAndSet wiki:上找到

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

测试并设定其中两项的低分,即高公交流量和不公平。

当处理器P1已经获得锁并且处理器P2也在等待锁时,P2将在试图获得锁时继续引起总线事务。当一个处理器获得了锁时,所有希望获得相同锁的其他处理器都会不断尝试通过重复启动总线事务来获得锁,直到它们获得锁为止。这大大增加了测试和设置的总线流量要求。这会减慢来自缓存和一致性未命中的所有其他流量。它降低了整个路段的速度,因为失败的锁获取尝试使流量饱和。测试和测试设置是对TSL的改进,因为它不会连续启动锁获取请求。

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

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

最新更新