spin_lock and mutex_lock
来源:互联网 发布:linux classpath 编辑:程序博客网 时间:2024/05/17 07:41
[转]mutex和spin lock的区别
信号量mutex是sleep-waiting。 就是说当没有获得mutex时,会有上下文切换,将自己、加到忙等待队列中,直到另外一个线程释放mutex并唤醒它,而这时CPU是空闲的,可以调度别的任务处理。
而自旋锁spin lock是busy-waiting。就是说当没有可用的锁时,就一直忙等待并不停的进行锁请求,直到得到这个锁为止。这个过程中cpu始终处于忙状态,不能做别的任务。
例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0 和Core1上。 用spin-lock,coer0上的线程就会始终占用CPU。
另外一个值得注意的细节是spin lock耗费了更多的user time。这就是因为两个线程分别运行在两个核上,大部分时间只有一个线程能拿到锁,所以另一个线程就一直在它运行的core上进行忙等待,CPU占用率一直是100%;而mutex则不同,当对锁的请求失败后上下文切换就会发生,这样就能空出一个核来进行别的运算任务了。(其实这种上下文切换对已经拿着锁的那个线程性能也是有影响的,因为当该线程释放该锁时它需要通知操作系统去唤醒那些被阻塞的线程,这也是额外的开销)
总结
(1)Mutex适合对锁操作非常频繁的场景,并且具有更好的适应性。尽管相比spin lock它会花费更多的开销(主要是上下文切换),但是它能适合实际开发中复杂的应用场景,在保证一定性能的前提下提供更大的灵活度。
(2)spin lock的lock/unlock性能更好(花费更少的cpu指令),但是它只适应用于临界区运行时间很短的场景。而在实际软件开发中,除非程序员对自己的程序的锁操作行为非常的了解,否则使用spin lock不是一个好主意(通常一个多线程程序中对锁的操作有数以万次,如果失败的锁操作(contended lock requests)过多的话就会浪费很多的时间进行空等待)。
(3)更保险的方法或许是先(保守的)使用 Mutex,然后如果对性能还有进一步的需求,可以尝试使用spin lock进行调优。毕竟我们的程序不像Linux kernel那样对性能需求那么高(Linux Kernel最常用的锁操作是spin lock和rw lock)。
qualcomm interview
- spin_lock and mutex_lock
- spin_lock & mutex_lock的区别?
- spin_lock & mutex_lock的区别?
- spin_lock & mutex_lock的区别
- spin_lock & mutex_lock的区别
- spin_lock & mutex_lock的区别
- spin_lock & mutex_lock的区别? .
- spin_lock与mutex_lock
- spin_lock & mutex_lock的区别?
- spin_lock & mutex_lock的区别
- spin_lock & mutex_lock的区别? .
- spin_lock & mutex_lock的区别?
- spin_lock & mutex_lock的区别? .
- spin_lock & mutex_lock的区别?
- spin_lock & mutex_lock的区别? .
- mutex_lock&spin_lock和信号量区别
- 内核锁 spin_lock 与 mutex_lock 区别? -- linux内核
- spin_lock 自旋锁 和 mutex_lock 互斥锁的区别
- Android Studio中导入第三方库工程的方法
- is-a, is-like-a, has-a
- jquery 表单 清空
- web前端H5培训开发设计师好不好
- 【重拾】nodeJS路由
- spin_lock and mutex_lock
- 软件安全性测试测试项目列表
- MongoDB的外键关联
- 谷歌安卓官方文档之编译系统
- Hadoop及RHadoop的初步尝试
- error while loading shared libraries: libreadline.so.5: cannot open shared object file
- centos 6.5 x64编译有python的vim7.4 - yantze
- iOS QQ分享(最新2015.12.25)
- Java我的高效编程之常用函数