我需要解决以下问题:
展示如何使用TestandSet指令实现获取()和释放()锁操作。
b.确定在多处理器上运行时可能在解决方案中出现的性能问题,但在单处理器上不发生。描述出现性能问题的具体场景。
c.描述另一种降低b中性能问题的锁实现,并解释它如何在您在b中介绍的具体场景中有所帮助。
我的and ()和have ()的设置如下所示:
acquire() {
    while(TestandSet(true)){
        //wait for lock to be released
    {
}
release() {
    TestandSet(false);
}但是,我无法确定多个处理器或单个处理器的性能问题。性能问题是什么?或者,是否正确地实现了获取()和释放()?
发布于 2018-10-31 01:47:13
在testAndSet维基上找到的:
锁的四大评估指标一般是无竞争锁获取延迟、总线流量、公平性和存储。
测试和设置分数很低,其中两个,即高巴士流量和不公平.
当处理器P1获得了锁,而处理器P2也在等待锁时,P2将不断发生总线事务,试图获取锁。当处理器获得了锁时,所有希望获得相同锁的其他处理器都试图通过反复启动总线事务来获取锁,直到它们获得锁为止。这大大增加了测试和设置的公共汽车流量要求.这会减慢缓存中的所有其他通信量,从而导致一致性丢失。它减慢了整个部分的速度,因为流量被失败的锁获取尝试所饱和。与TSL相比,测试和测试集是一个改进,因为它不会持续地启动锁获取请求。
当我们考虑公平性时,我们考虑的是当锁被释放时,处理器是否有获得锁的公平机会。在极端情况下,处理器可能会饿死,也就是说,即使在这段时间内,它已经自由了,也可能无法在很长一段时间内获得锁。
TSL的存储开销几乎为零,因为只需要一个锁。没有竞争的延迟也很低,因为只需要一个原子指令和分支。
https://stackoverflow.com/questions/53074716
复制相似问题