这种说法对吗?

发布于 2022-09-18 18:15:21 字数 60 浏览 9 评论 0

“使用信号量就是一种阻塞操作;使用自旋锁就是一种非阻塞操作”

此种说法是否正确?应该怎样理解?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

掩耳倾听 2022-09-25 18:15:21

不知你这句话从何处摘录,如何理解这句话要看你从哪个角度来看了:
信号量和自旋锁在底层实现上都非常相似,比如说,底层都是一个整形数,1表示资源可用,程序可顺利往下执行;而0则表示资源部可用,需要等待。不同的是,信号量和自旋锁在资源不可用,需要等待的处理上有些不同:信号量等待的方式是将当前执行进程挂起,如挂入等待某资源专用的队列中,被挂起进程在系统调度程序中被排除在外,直到进程等待的资源可用从而进程被唤醒为止;自选锁等待的方式有些“霸道”,其并不放弃处理器,而是不断自旋,也即执行类似如下的语句:
for( ; ; ){
     if(condition meet) break;
}

从而可以看出,执行自旋操作的进程在此陷入循环中,正因如此,自旋锁一般只用于多处理器核的机器中,对于单处理器非抢占式内核(如2.4),使用自旋锁会使系统陷入死机,所以在单处理器上,Linux操作系统在编译时将自选锁被优化为nothing,即不执行任何操作。

从进程使用CPU的角度而言,信号量等待的资源不可用时,当前进程将被挂起,让出CPU给其他进程;而自旋锁则不断使用CPU进行类似轮询的操作。

从应用层来看,用户看到的现象是一致的:就是进程陷入某处无法往下执行。

所以:
1.如果从内核角度而言,上面这句话是讲的通的(但是有些误人子弟)。
2.如果从用户角度而言,二者都是阻塞的。

忠告:自旋锁一般不要使用,当你还要问别人要不要用时。

建议你参考LDD3对信号量,自旋锁的有关内容,或者直接阅读诸如spin_lock之类的内核函数实现。

猫腻 2022-09-25 18:15:21

信号量可能引起睡眠, 自旋锁不会睡眠

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文