mutex 和 spinlock 对比
理论上:
mutex和spinlock都是用于多进程/线程间访问公共资源时保持同步用的,只 是在lock失败的时候处理方式有所不同。首先,当一个thread 给一个mutex上锁失败的时候,thread会进入sleep状态,从而让其他的thread运行,其中就包裹已经给mutex上锁成功的那个 thread,被占用的lock一旦释放,就会去wake up 那个sleep的thread。其次,当一个thread给一个spinlock上锁失败的时候,thread会在spinlock上不停的轮讯,直到成 功,所以他不会进入sleep状态(当然,时间片用完了,内核会自动进行调度)。
存在的问题:
无论是mutex还是spinlock,如果一个thread去给一个已经被其他thread占用的锁上锁,那么从此刻起到其他thread对此锁解锁的时间长短将会导致mutex和spinlock出现下面的问题。
mutex的问题是,它一旦上锁失败就会进入sleep,让其他thread运行,这
就需要内核将thread切换到sleep状态,如果mutex又在很短的时间内被释放掉了,那么又需要将此thread再次唤醒,这需要消耗许多CPU
指令和时间,这种消耗还不如让thread去轮讯。也就是说,其他thread解锁时间很短的话会导致CPU的资源浪费。
spinlock的问题是,和上面正好相反,如果其他thread解锁的时间很长的话,这种spinlock进行轮讯的方式将会浪费很多CPU资源。
解决方法:
对于single-core/single-CPU,spinlock将一直浪费
CPU资源,如果采用mutex,反而可以立刻让其他的thread运行,可能去释放mutex
lock。对于multi-core/mutil-CPU,会存在很多短时间被占用的lock,如果总是去让thread sleep,紧接着去wake
up,这样会浪费很多CPU资源,从而降低了系统性能,所以应该尽量使用spinlock。
现实情况:
由于程序员不太可能确定每个运行程序的系统CPU和core的个数,所以也不可能去确
定使用那一种lock。因此现在的操作系统通常不太区分mutex和spinlock了。实际上,大多数现代操作系统已经使用了混合
mutex(hybrid mutex)和混合spinlock(hybrid spinlock)。说白了就是将两者的特点相结合。
hydrid mutex:在一个multi-core系统上,hybrid
mutex首先像一个spinlock一样,当thread加锁失败的时候不会立即被设置成sleep,但是,当过了一定的时间(或则其他的策略)还没有
获得lock,就会被设置成sleep,之后再被wake up。而在一个single-core系统上,hybrid
mutex就不会表现出spinlock的特性,而是如果加锁失败就直接被设置成sleep。
hybrid spinlock:和hybrid
mutex相似,只不过,thread加锁失败后在spinlock一段很短的时间后,会被stop而不是被设置成sleep,stop是正常的进程调
度,应该会比先让thread sleep然后再wake up的开销小一些。
总结:
写程序的时候,如果对mutex和spinlock有任何疑惑,请选择使用mutex。
mutex 和 spinlock 对比的更多相关文章
- Mutex, semaphore, spinlock
Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个.一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行. Semaphor ...
- Mutex, semaphore, spinlock的深度解析
Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个.一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行. Semaphor ...
- std::shared_mutex和std::mutex的性能对比(banchmark)
原文作者:@玄冬Wong 转载请注明原文出处:http://aigo.iteye.com/blog/2296462 key world: std::shared_mutex.std::mutex.pe ...
- 锁相关知识 & mutex怎么实现的 & spinlock怎么用的 & 怎样避免死锁 & 内核同步机制 & 读写锁
spinlock在上一篇文章有提到:http://www.cnblogs.com/charlesblc/p/6254437.html 通过锁数据总线来实现. 而看了这篇文章说明:mutex内部也用到 ...
- Pthreads并行编程之spin lock与mutex性能对比分析(转)
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API.线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用 ...
- 【linux】spinlock 的实现
一.什么是spinlock spinlock又称自旋锁,是实现保护共享资源而提出一种锁机制.自旋锁与互斥锁比较类似,都是为了解决对某项资源的互斥使用 无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一 ...
- [MySQL Reference Manual]14 InnoDB存储引擎
14 InnoDB存储引擎 14 InnoDB存储引擎 14.1 InnoDB说明 14.1.1 InnoDB作为默认存储引擎 14.1.1.1 存储引擎的趋势 14.1.1.2 InnoDB变成默认 ...
- C/C++ Volatile关键词深度剖析(转)
本文转载自博文C/C++ Volatile关键词深度剖析. 背景 前几天,发了一条如下的微博 (关于C/C++ Volatile关键词的使用建议): 此微博,引发了朋友们的大量讨论:赞同者有之:批评者 ...
- c++Volatile关键词
看到的一篇文章觉得还不错吧,文章具体位置也找不到了,复制一下,留着日后复习 背景 此微博,引发了朋友们的大量讨论:赞同者有之:批评者有之:当然,更多的朋友,是希望我能更详细的解读C/C++ Volat ...
随机推荐
- 配置Tomcat中的Context元素中的中文问题
发布一个名叫helloapp的web应用,helloapp位于D:\我\helloapp.发布的方式是通过配置<CATALINA_HOME>/conf/Catalina/localhost ...
- 32位的CPU最多只能支持最大到4GBytes的内存
和总线宽度相似的,CPU每次能够处理的数据量称为字组大小(word size), 字组大小依据CPU癿设计而有32位与64位.我们现在所称的计算机是32或64位主要是依据这个 CPU解析的字组大小而来 ...
- rub、sass和compass的安装
长话短说,直接进入正题. [ruby安装] ruby下载网址:http://rubyinstaller.org/downloads/ 选择适合自己电脑的版本: 下载完成后直接双击安装,记得勾选加入环境 ...
- PHP方法的作用域
PHP支持6种方法作用域:public.private.protected.abstract.final和static,本文只讨论前5种作用域. public:公共作用域.(就像空气和阳光,天下公用) ...
- 基于cygwin构建u-boot(二)gcc的C语言标准版本号(-std=)
接上文,修改Makefile和config.mk中,.depend相关文件格式后继续编译. 四.tools文件夹的文件编译错误 错误告警如下[多行信息,请使用右侧滚动条查看]: gcc -Wall - ...
- How Many Tables(POJ 1213 求连通分量)
How Many Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- 像asp.net Mvc一样开发nodejs+express Mvc站点
像asp.net Mvc一样开发nodejs+express Mvc站点 首先,我是个c#码农.从事Mvc开发已然4个年头了,这两年前端MVC的兴起,我也跟风学了一些,对前端的框架也了解一些,angu ...
- 挑战以Dropbox为代表的传统“同步网盘”,Seafile推出“分布式文件同步技术”打造的私有云服务
挑战以Dropbox为代表的传统“同步网盘”,Seafile推出“分布式文件同步技术”打造的私有云服务#36氪开放日# 其他 JasonZheng • 2012-04-07 15:14 来自36氪开放 ...
- X windows的底层实现机制
Qt在Linux上运行崩溃了,很可能的原因是对于X11机制的不了解.很可能是UI代码里面对窗口的操作不规范而导致Qt内部的BUG暴露出来.具体UI实现代码我也没有看.是别人维护的.打算今天去看下代码, ...
- 三 ICE开发初级研究
http://www.acejoy.com/bbs/viewthread.php?tid=2878&extra=page%3D1 ICE开发初级研究(一) 最近一段一直在忙于工作,事情比较多, ...