我需要解决以下问题:
a。演示如何使用TestandSet指令实现Acquisition()和release()锁定操作。
b。确定性能问题,该问题可能在您的解决方案在多处理器上运行时发生,而在单处理器上则不会发生。描述出现性能问题的具体方案。
c。描述一种可减少b中的性能问题的替代锁实现,并说明它在您在b中提出的具体情况下如何提供帮助。
我有如下的acquire()和release()设置:
acquire() {
while(TestandSet(true)){
//wait for lock to be released
{
}
release() {
TestandSet(false);
}
但是,我无法确定有关多个处理器或单个处理器的任何性能问题。性能问题是什么?或者,我对acquire()和release()的实现是否正确?
答案 0 :(得分:0)
在testAndSet Wiki上找到:
一般来说,锁的四个主要评估指标是无竞争的锁获取延迟,总线流量,公平性和存储。
测试设置在其中两个方面得分较低,即客流量大和不公平。
当处理器P1已获得锁并且处理器P2也正在等待锁时,P2将继续进行总线事务以尝试获取锁。当一个处理器获得了一个锁时,所有希望获得相同锁的其他处理器也将通过反复启动总线事务来尝试获得该锁,直到它们获得该锁为止。这大大增加了测试设置的总线流量需求。这减慢了所有其他来自缓存和一致性未命中的流量。由于流量因失败的锁获取尝试而饱和,因此减慢了整个部分的速度。测试和设置集是对TSL的改进,因为它不会连续发起锁获取请求。
当我们考虑公平性时,我们考虑处理器在被释放时是否有公平的机会获得锁。在极端情况下,处理器可能会饿死,即,即使在这段时间内它已变为空闲状态,也可能无法长时间获取该锁。
TSL的存储开销几乎为零,因为只需要一个锁。无竞争的等待时间也很低,因为只需要一个原子指令和分支。