免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2199 | 回复: 2
打印 上一主题 下一主题

这种说法对吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-18 22:00 |只看该作者 |倒序浏览
5可用积分
“使用信号量就是一种阻塞操作;使用自旋锁就是一种非阻塞操作”

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

最佳答案

查看完整内容

不知你这句话从何处摘录,如何理解这句话要看你从哪个角度来看了:信号量和自旋锁在底层实现上都非常相似,比如说,底层都是一个整形数,1表示资源可用,程序可顺利往下执行;而0则表示资源部可用,需要等待。不同的是,信号量和自旋锁在资源不可用,需要等待的处理上有些不同:信号量等待的方式是将当前执行进程挂起,如挂入等待某资源专用的队列中,被挂起进程在系统调度程序中被排除在外,直到进程等待的资源可用从而进程被唤醒 ...

论坛徽章:
0
2 [报告]
发表于 2009-04-18 22:00 |只看该作者

回复 #1 todayrw 的帖子

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

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

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

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

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

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

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

论坛徽章:
0
3 [报告]
发表于 2009-04-19 10:15 |只看该作者
信号量可能引起睡眠, 自旋锁不会睡眠
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP