互斥锁总是作为自旋等待实现吗?互斥锁能否实现为块等待?(操作系统概念第5.4节只提到通过spin等待实现。见下文。)(作为比较,信号量的等待可以通过在循环中繁忙地旋转或被阻塞来实现。见操作系统概念9ed第5.5和5.6节和是否仍在忙于等待信号量的进程阻塞实现?)
如果互斥锁可以实现为块等待,那么互斥锁是否与二进制信号量相同?(Stalling的OS书中说互斥锁和二进制信号量是否必须是锁定互斥锁的进程(将值设置为零)。它没有提到他们是否有不同的旋转,只等待。见下文。)
在操作系统概念中,5.5 Mutex锁将互斥锁定义为:
我们使用互斥锁保护关键区域,从而防止种族状况。也就是说,进程必须在进入关键部分之前获取锁;它在退出关键部分时释放锁。5.8 ()函数获取锁,Figure ()函数释放锁,如图5.8所示。互斥锁有一个布尔变量可用,其值指示锁是否可用。如果锁可用,则成功调用获取(),然后认为锁不可用。试图获取不可用锁的进程将被阻塞,直到锁被释放。wait ()的definition如下所示:wait(){ while (!fi);fi繁忙等待*/ available =false;}fi的finition()如下所示:fi(){fi= true;}必须原子地执行对fi()或fi()的调用。因此,互斥锁通常使用5.4节中描述的硬件机制之一实现,我们将此技术描述为练习。这里给出的实现的主要缺点是它需要繁忙的等待。当进程处于关键部分时,任何其他试图进入关键部分的进程都必须在调用中不断循环以获取()。实际上,这种类型的互斥锁也称为自旋锁,因为进程在等待锁可用时“自旋”。
Stalling的操作系统手册上写着
与二进制信号量相关的一个概念是互斥。两者之间的一个关键区别是,锁定互斥锁(将值设置为零)的进程必须是解锁它的进程(将值设置为1)。相反,一个进程可以锁定二进制信号量,而另一个进程可以解锁它。
谢谢。
发布于 2020-11-09 17:12:52
不是的。互斥锁可以是旋转等待,也可以是阻塞。它甚至可以是一个组合,例如,它旋转-等待多个周期,如果它没有获得锁,它会更改为阻塞等待。
https://softwareengineering.stackexchange.com/questions/418804
复制相似问题