“使用信号量就是一种阻塞操作;使用自旋锁就是一种非阻塞操作”
此种说法是否正确?应该怎样理解?
不知你这句话从何处摘录,如何理解这句话要看你从哪个角度来看了:信号量和自旋锁在底层实现上都非常相似,比如说,底层都是一个整形数,1表示资源可用,程序可顺利往下执行;而0则表示资源部可用,需要等待。不同的是,信号量和自旋锁在资源不可用,需要等待的处理上有些不同:信号量等待的方式是将当前执行进程挂起,如挂入等待某资源专用的队列中,被挂起进程在系统调度程序中被排除在外,直到进程等待的资源可用从而进程被唤醒为止;自选锁等待的方式有些“霸道”,其并不放弃处理器,而是不断自旋,也即执行类似如下的语句:for( ; ; ){ if(condition meet) break;}
从而可以看出,执行自旋操作的进程在此陷入循环中,正因如此,自旋锁一般只用于多处理器核的机器中,对于单处理器非抢占式内核(如2.4),使用自旋锁会使系统陷入死机,所以在单处理器上,Linux操作系统在编译时将自选锁被优化为nothing,即不执行任何操作。
从进程使用CPU的角度而言,信号量等待的资源不可用时,当前进程将被挂起,让出CPU给其他进程;而自旋锁则不断使用CPU进行类似轮询的操作。
从应用层来看,用户看到的现象是一致的:就是进程陷入某处无法往下执行。
所以:1.如果从内核角度而言,上面这句话是讲的通的(但是有些误人子弟)。2.如果从用户角度而言,二者都是阻塞的。
忠告:自旋锁一般不要使用,当你还要问别人要不要用时。
建议你参考LDD3对信号量,自旋锁的有关内容,或者直接阅读诸如spin_lock之类的内核函数实现。
信号量可能引起睡眠, 自旋锁不会睡眠
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(2)
不知你这句话从何处摘录,如何理解这句话要看你从哪个角度来看了:
信号量和自旋锁在底层实现上都非常相似,比如说,底层都是一个整形数,1表示资源可用,程序可顺利往下执行;而0则表示资源部可用,需要等待。不同的是,信号量和自旋锁在资源不可用,需要等待的处理上有些不同:信号量等待的方式是将当前执行进程挂起,如挂入等待某资源专用的队列中,被挂起进程在系统调度程序中被排除在外,直到进程等待的资源可用从而进程被唤醒为止;自选锁等待的方式有些“霸道”,其并不放弃处理器,而是不断自旋,也即执行类似如下的语句:
for( ; ; ){
if(condition meet) break;
}
从而可以看出,执行自旋操作的进程在此陷入循环中,正因如此,自旋锁一般只用于多处理器核的机器中,对于单处理器非抢占式内核(如2.4),使用自旋锁会使系统陷入死机,所以在单处理器上,Linux操作系统在编译时将自选锁被优化为nothing,即不执行任何操作。
从进程使用CPU的角度而言,信号量等待的资源不可用时,当前进程将被挂起,让出CPU给其他进程;而自旋锁则不断使用CPU进行类似轮询的操作。
从应用层来看,用户看到的现象是一致的:就是进程陷入某处无法往下执行。
所以:
1.如果从内核角度而言,上面这句话是讲的通的(但是有些误人子弟)。
2.如果从用户角度而言,二者都是阻塞的。
忠告:自旋锁一般不要使用,当你还要问别人要不要用时。
建议你参考LDD3对信号量,自旋锁的有关内容,或者直接阅读诸如spin_lock之类的内核函数实现。
信号量可能引起睡眠, 自旋锁不会睡眠