自旋锁 互斥锁

来源:互联网 发布:淘宝直播的东西好吗 编辑:程序博客网 时间: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

0 0
原创粉丝点击