首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >互斥锁总是作为自旋等待实现吗?

问互斥锁总是作为自旋等待实现吗?
EN

Software Engineering用户
提问于 2020-11-09 15:54:22
回答 1查看 700关注 0票数 0

互斥锁总是作为自旋等待实现吗?互斥锁能否实现为块等待?(操作系统概念第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)。相反,一个进程可以锁定二进制信号量,而另一个进程可以解锁它。

谢谢。

EN

回答 1

Software Engineering用户

发布于 2020-11-09 17:12:52

不是的。互斥锁可以是旋转等待,也可以是阻塞。它甚至可以是一个组合,例如,它旋转-等待多个周期,如果它没有获得锁,它会更改为阻塞等待。

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/418804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档