Chinaunix

标题: 这种说法对吗? [打印本页]

作者: todayrw    时间: 2009-04-18 22:00
标题: 这种说法对吗?
“使用信号量就是一种阻塞操作;使用自旋锁就是一种非阻塞操作”

此种说法是否正确?应该怎样理解?
作者: ingdxdy    时间: 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之类的内核函数实现。
作者: star316    时间: 2009-04-19 10:15
信号量可能引起睡眠, 自旋锁不会睡眠




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2