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