自旋锁 互斥锁
来源:互联网 发布:淘宝直播的东西好吗 编辑:程序博客网 时间:2024/05/20 03:47
自旋锁 互斥锁
本文从以下3个方面来介绍。
1. 为什么会有自旋锁、互斥锁?
2. 什么是自旋锁、互斥锁?
3. 分别有什么作用?
1. 为什么会有自旋锁、互斥锁?
讲这些锁之前,先谈以下并发、临界区、同步的概念。
1.1 并发 临界区 同步
临界区:是操作系统的概念,每个进程中访问共享资源的代码段称为临界区;
并发:分为单处理器和多处理器上的并发。
如果在单处理器主机上发生并发,在这种主机中多个线程共享同一个 CPU 并且抢占(preemption)创建竞态条件。抢占 通过临时中断一个线程以执行另一个线程的方式来实现 CPU 共享。竞态条件发生在两个或更多线程操纵一个共享数据项时,其结果取决于执行的时间;
如果在在多处理器计算机中并发,其中每个处理器中共享相同数据的线程同时执行。注意在 MP 情况下存在真正的并行(parallelism),因为线程是同时执行的。而在 UP 情形中,并行是通过抢占创建的。
下面通过一个例子来说明并发:
如果不是并发:
对资源i的访问:ProcessA和B访问后得到正确的结果应该是9:
进程是并发执行,有可能得到的结果是:8
于是,为了阻止这种情况发生,保证对资源访问的原子操作,引入了锁机制。
这里又引入了一个新名词,什么是原子操作。一操作系统老师说过,最烦解释一个名词时又使用另外一个名词。
原子操作:不可被中断的一个或一系列操作。
同步:同步的概念一般和互斥的概念一起讲。进程同步也是进程之间直接的制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系来源于他们之间的合作。
1.2 锁
通过加锁来保证进程间的同步,因为加锁后,进程对共享资源的访问操作都是原子操作,不会出错(另外一种常用的同步机制是barrier,之前在块设备层见过barrier)。
锁的种类有很多,如互斥锁,自旋锁,读写锁,现在用的比较多的是互斥锁和自旋锁,所以下面介绍一下互斥锁和自旋锁。
2. 互斥锁和自旋锁
2.1 两种锁的基本概念
互斥锁(mutexlock):最常使用于线程同步的锁;标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁;
自旋锁(spinlock):同样用来标记只能有一个线程访问该对象,在同一线程多次加锁操作会造成死锁;
2.2 两种锁的对比
两种锁的加锁原理
互斥锁:线程会从sleep(加锁)——>running(解锁),过程中有上下文的切换,cpu的抢占,信号的发送等开销。
自旋锁:线程一直是running(加锁——>解锁),死循环检测锁的标志位,机制不复杂。
两种锁的区别
互斥锁的起始原始开销要高于自旋锁,但是基本是一劳永逸,临界区持锁时间的大小并不会对互斥锁的开销造成影响,而自旋锁是死循环检测,加锁全程消耗cpu,起始开销虽然低于互斥锁,但是随着持锁时间,加锁的开销是线性增长。
两种锁的应用
互斥锁用于临界区持锁时间比较长的操作,比如下面这些情况都可以考虑:
1 临界区有IO操作
2 临界区代码复杂或者循环量大
3 临界区竞争非常激烈
4 单核处理器
至于自旋锁就主要用在临界区持锁时间非常短且CPU资源不紧张的情况下。
3. 有什么用
就是起同步作用,保护共享资源。
补充一个死锁的概念:
死锁是指多个执行线程互相等待被对方占用的资源,但永远不会释放各自拥有的资源,导致众线程永远无法得到执行。
死锁发生的4个必要条件:
)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。(百度百科)
参考:
[1] http://blog.chinaunix.net/uid-22002972-id-1805575.html
[2] http://www.cnblogs.com/bastard/archive/2012/09/19/2694243.html
[3] http://blog.csdn.net/kyokowl/article/details/6294341
[4] http://www.cnblogs.com/CareySon/archive/2012/04/14/Process-SynAndmutex.html
[5] http://www.cnblogs.com/hdflzh/p/3716156.html
- 互斥锁 自旋锁 自适应自旋锁
- 互斥锁,自旋锁与自适应自旋锁
- 互斥锁,自旋锁与自适应自旋锁
- 自旋锁与互斥锁
- 信号量、自旋锁、互斥锁
- 自旋锁与互斥锁
- 自旋锁与互斥锁
- 自旋锁和互斥锁
- 自旋锁&信号量&互斥锁
- 自旋锁 互斥锁 区别
- 互斥锁与自旋锁
- 自旋锁 互斥锁
- 自旋锁和互斥锁
- 自旋锁与互斥锁
- 互斥锁与自旋锁
- 自旋锁和互斥锁
- 互斥锁和自旋锁
- 互斥锁和自旋锁
- 虚拟桌面技术的应用
- 黑马程序员——OC语言——block、protocol、代理模式
- ubuntu Gnome 15.04 /ubuntu 12.04 装cuda 7.0经验贴
- 生命不息,奋斗不止
- StrutsPrepareAndExecuteFilter Vs StrutsPrepareFilter and StrutsExecuteFilter
- 自旋锁 互斥锁
- 日期格式化分别得到年月日
- Java Welcome代码解释
- java的反射机制--示例
- 一点点学习SSH系列(一)Spring框架
- 属性
- 注意java8中已经没有匿名内部类和局部内部类只能访问final变量的限制了!
- Python类的一些有趣的函数
- mongoDB操作指令