操作系统 自旋锁和java信号量机制制有什么区别

信号量和自旋锁区别
自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环查看是否该自旋锁的保持者已经释放了锁,&自旋&就是&在原地打转&。而信号量则引起调用者睡眠,它把进程从运行队列上拖出去,除非获得锁。
------------------------------------------------------
虽然听起来两者之间的使用条件复杂,其实在实际使用中信号量和自旋锁并不易混淆。注意以下原则:
如果代码需要睡眠——这往往是发生在和用户空间同步时——使用信号量是唯一的选择。由于不受睡眠的限制,使用信号量通常来说更加简单一些。如果需要在自旋 锁和信号量中作选择,应该取决于锁被持有的时间长短。理想情况是所有的锁都应该尽可能短的被持有,但是如果锁的持有时间较长的话,使用信号量是更好的选
择。另外,信号量不同于自旋锁,它不会关闭内核抢占,所以持有信号量的代码可以被抢占。这意味者信号量不会对影响调度反应时间带来负面影响。
自旋锁对信号量
------------------------------------------------------
需求& && && && && && && &建议的加锁方法
低开销加锁& && && && && &&&&&& 优先使用自旋锁
短期锁定& && && && && &&&&&&&&&& 优先使用自旋锁
中断上下文中加锁& && && & 使用自旋锁
长期加锁& && && && && &&&&&&&&&&&&&&&& 优先使用信号量
持有锁是需要睡眠、调度& &&&使用信号量
————————————————————————————————
------------------------------------------------------
& & 自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,不需要自旋锁)。
&& 自旋锁最多只能被一个内核任务持有,如果一个内核任务试图请求一个已被争用(已经被持有)的自旋锁,那么这个任务就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求它的内核任务便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的内核任务同时进入临界区,因此这种锁可有效地避免多处理器上并发运行的内核任务竞争共享资源。
&&& 自旋锁的基本形式如下:
&&&&&&&&&&&&&&&&&spin_lock(&mr_lock);
&&&&&&&&&&&&&&&&&//临界区
&&&&&&&&&&&&&&&& spin_unlock(&mr_lock);
&&&&&&&因为自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。这点很好地满足了对称多处理机器需要的锁定服务。在单处 理器上,自旋锁仅仅当作一个设置内核抢占的开关。如果内核抢占也不存在,那么自旋锁会在编译时被完全剔除出内核。
&&&&&& 简单的说,自旋锁在内核中主要用来防止多处理器中并发访问临界区,防止内核抢占造成的竞争。另外自旋锁不允许任务睡眠&(&持有自旋锁的任务睡眠会造成自死锁——因为睡眠有可能造成持有锁的内核任务被重新调度,而再次申请自己已持有的锁),它能够在中断上下文中使用。
&&&&&&&死锁:假设有一个或多个内核任务和一个或多个资源,每个内核都在等待其中的一个资源,但所有的资源都已经被占用了。这便会发生所有内核任务都在相互等待, 但它们永远不会释放已经占有的资源,于是任何内核任务都无法获得所需要的资源,无法继续运行,这便意味着死锁发生了。自死琐是说自己占有了某个资源,然后 自己又申请自己已占有的资源,显然不可能再获得该资源,因此就自缚手脚了。
一、为什么用自旋锁
&&&&操作系统锁机制的基本原理,就是在某个锁操作过程中不能与其他锁操作交织执行,以免多个执行路径对内核中某些重要的数据及数据结构进行同时操作而造成混乱。在不同的系统环境中,根据系统特点和操作需要,锁机制可以用多种方式来实现。以Linux为例,其系统内核的锁机制一般通过3 种基本方式来实现,即原语、关中断和总线锁。
&&&&&&&在单CPU系统中,CPU 的读—修改—写原语可以保证是原子的,即执行过程过中不会被中断,所以CPU 通过关中断的方式,从芯片级保证该操作所存取的数据不能被多个内核控制路径同时访问,避免交叉执行。然而,在对称多处理器 (SMP) 环境中,单CPU 涉及读—修改—写原语不再是原子的,因为,在某个CPU 执行读—修改—写指令时有多次总线操作,其他CPU
竞争总线,可导致对同一存储单元的读—写操作与其他CPU 对这一存储单元交叉,这时我们就需要用一个称为自旋锁(spin lock)的原始对象为CPU 提供锁定总线的方法。
二、自旋锁是什么
&&&&自旋锁(spin lock)是一个典型的对临界资源的互斥手段,它的名称来源于它的特性。为了获得一个自旋锁,在某CPU上运行的代码需先执行一个原子操作,该操作测试并设置(test-and-set)某个内存变量,由于它是原子操作,所以在该操作完成之前其它CPU不可能访问这个内存变量。如果测试结果表明锁已经空闲,则程序获得这个自旋锁并继续执行。如果测试结果表明锁仍被占用,程序将在一个小的循环内重复这个“测试并设置(test-and-set)”操作,即开始“自旋”。最后,锁的所有者通过重置该变量释放这个自旋锁,于是,某个等待的test-and-set操作向其调用者报告锁已释放。
三、关于自旋锁的几个事实
&&&自旋锁实际上是忙等锁,当锁不可用时,CPU一直循环执行“测试并设置(test-and-set)”该锁直到可用而取得该锁,CPU在等待自旋锁时不做任何有用的工作,仅仅是等待。这说明只有在占用锁的时间极短的情况下,使用自旋锁是合理的,因为此时某个CPU可能正在等待这个自旋锁。当临界区较为短小时,如只是为了保证对数据修改的原子性,常用自旋锁;当临界区很大,或有共享设备的时候,需要较长时间占用锁,使用自旋锁就不是一个很好的选择,会降低CPU的效率。
&&&自旋锁也存在死锁(deadlock)问题。引发这个问题最常见的情况是要求递归使用一个自旋锁,即如果一个已经拥有某个自旋锁的CPU想第二次获得这个自旋锁,则该CPU将死锁。自旋锁没有与其关联的“使用计数器”或“所有者标识”;锁或者被占用或者空闲。如果你在锁被占用时获取它,你将等待到该锁被释放。如果碰巧你的CPU已经拥有了该锁,那么用于释放锁的代码将得不到运行,因为你使CPU永远处于“测试并设置”某个内存变量的自旋状态。另外,如果进程获得自旋锁之后再阻塞,也有可能导致死锁的发生。由于自旋锁造成的死锁,会使整个系统挂起,影响非常大。
&&自旋锁一定是由系统内核调用的。不可能在用户程序中由用户请求自旋锁。当一个用户进程拥有自旋锁期间,内核是把代码提升到管态的级别上运行。在内部,内核能获取自旋锁,但任何用户都做不到这一点
四、自旋锁与信号量比较
&&&&自旋锁和信号量是解决互斥问题的基本手段,无论是单处理系统还是多处理系统,它们可以不需修改代码地进行移植。那么,这两个手段应该如何选择呢?这就要考虑临界区的性质和系统处理的要求。
&&&&从严格意义上说,信号量和自旋锁属于不同层次的互斥手段,前者的实现有赖于后者。
信号量是进程级的,用于多个进程之间对资源的互斥,虽然也是在内核中,但是该内核执行路径是以进程的身份,代表进程来争夺资源的。如果竞争不上,会有上下文切换,进程可以去睡眠,但CPU不会停,会接着运行其他的执行路径。从概念上说,这与单CPU或多CPU没有直接的关系,只是在信号量本身的实现上,为了保证信号量结构存取的原子性,在多CPU中需要自旋锁来互斥。但是值得注意的是上下文切换需要一定时间,并且会使高速缓冲失效,对系统性能影响是很大的。因此,只有当进程占用资源很长时间时,用信号量才是不错的选择。
&&&当所要保护的临界区比较短时,用自旋锁是非常方便的,因为它节省上下文切换的时间。但是CPU得不到自旋锁会在那里空转直到锁成功为止,所以要求锁不能在临界区里停留很长时间,否则会降低系统的效率。
&&&综上,自旋锁是一种保护数据结构或代码片段的原始方式,主要用于SMP中,用于CPU同步,在某个时刻只允许一个进程访问临界区内的代码。它的实现是基于CPU锁定数据总线的指令。为保证系统效率,自旋锁锁定的临界区一般比较短。在单CPU系统中,使用自旋锁的意义不大,还容易因为递归调用自旋锁造成死锁。
------------------------------------------------------
Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行 其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。
信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;另外当代码持有信号量时,不可以再持有自旋锁。
信号量基本使用形式为:
static DECLARE_MUTEX(mr_sem);//声明互斥信号量
if(down_interruptible(&mr_sem))
//可被中断的睡眠,当信号来到,睡眠的任务被唤醒&
up(&mr_sem);
本文已收录于以下专栏:
相关文章推荐
自旋锁(SpinLock):锁的目的是为了保护共享资源,实现线程同步。自旋锁区别于其他锁的地方在于若某线程在未获得锁时将不断的询问(判断)自旋锁保持者是否释放了锁(获取锁操作将自旋在那里,不断地申请获...
const DWORD dwMax = 200000...
程序员升职加薪指南!还缺一个“证”!
CSDN出品,立即查看!
一、信号量信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来,为了获得...
区别一:实现方式
自旋锁是自旋等待,进程状态始终处于TASK_RUNNING。
信号量是睡眠等待,进程在等待是处于TASK_INTERRUPTIBLE。
区别二:睡眠死锁陷阱:
自旋锁与信号量作为同步机制,都是用来保护临界区的,但是它们的工作方式完全不一样。
自旋锁只有两种状态,即LOCKED与UNLOCKED。
而信号量既可以作为互斥锁来使用(此时具有0和1两种状态...
原帖地址:http://blog.csdn.net/lhf_tiger/article/details/7203299
Mutex是一把钥匙,一个人拿了就可进入一个房间,出...
1)内核同步措施
为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据的保护。我们的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别。
sem就是一个睡眠锁.如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将...
三种锁各有优缺点:
临界区是轻量级的锁,通常不会产生内核对象。其内部实现是基于自旋锁与事件对象等待来实现锁定的。 互斥体与信号量都是内核对...
转自:/content/12/19.shtml
为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据...
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)下次自动登录
现在的位置:
& 综合 & 正文
简单认识自旋锁和信号量
为了避免多个进程对同一资源进行访问或多处理器并发产生竞争,内核采用锁机制来实现对共享数据的保护。首先简单分析一下操作系统之分类:
一 操作系统分类
实时操作系统和分时操作系统。它们的共同特点是都是多任务的,但是主要区别在于应用场合,举个不恰当的例子实时操作系统应用于导弹发射、卫星发射等实时性要求较高的场合,而分时操作对实时性要求相对较低场合。
多任务操作系统分为两类:非抢占式多任务和抢占式多任务。
非抢占式多任务,就是每个进程不断的占用CPU,直到运行完毕或者是自己让出,别的进程才能使用CPU。抢占式多任务,就是每个进程占用CPU时间是有限的,到了一定时间,它必须让出来,类似于计算机网路中的分时复用技术。抢占式多任务调度是很多操作系统最基本的调度方法。
二 进程调度
实际中我们发现进程可以分为两类:
I/O消耗型:就是说进程频繁的和外界交互,比如要打开、浏览文件,要等待用户命令,要读取光盘上的数据。
处理器消耗型:就是说进程多数时间总是不断的在CPU里面运行,很少需要等待。所以我们应该区别对待这两种类型的进程。我们利用处理器遵循的原则是:吞吐量大和响应时间快。对于I/O消耗型,由于它需要频繁等待I/O,这样它需要较高的优先级来抢占当前运行进程,以确保当I/O条件满足后能马上得到CPU响应,并且它的时间片相对其它处理器消耗型进程来说更长。相反,处理器消耗型进程优先级相对就低了,并且其时间片没有必要太长。
让我们看一个例子,加深理解:假设用户运行两个程序,一个是打字程序,一个是视频程序。很明显,打字程序是I/O消耗型的,而视频程序是处理器消耗型的。人的打字速度再快也不可能快过计算机计算视频编码并在屏幕上显示出来的速度,可是人希望他每打一个字,就能输入计算机并在屏幕上显示。因此,对于打字程序,我们让它有较高的优先级,以便让人可以马上输入,并且其时间片也要多些;相比下,视频程序的优先级就低些,以便让位给打字程序,时间片当然也就少些。实际上,一般来说,优先级越高,时间片也就越长,反之亦然。
锁机制的原理是当进程进入CPU运行时,就会给它的代码上锁,以免别的CPU中的进程修改里面的代码。锁本身是一种互斥锁,即有“上锁”和“开锁”一说!
一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。
简单的说所谓自旋锁就是这样的一把锁:进程A进入CPU,锁上门运行,进程B来到CPU前,发现门被锁上了,于是等待进程A出来交出开锁钥匙。
正如每次我们谈到“锁”这个概念时,总会谈到“死锁”——是的,我们用锁,就必须防止死锁,死锁是这样产生的:进程A进入CPU运行,上锁,进程B来到CPU门前等待进程A出来,可是糟糕的情况出现了:进程A要想出来就必须获取进程B的帮助,于是进程A开始等待进程B的帮助,可是进程B却又一直等待进程A出来!这样的等待无法终止,最终成为死锁。
再比如,进程A要锁上甲代码段,然后想再去锁乙代码段,进程B要锁上乙代码段,然后想再去锁甲代码段。第一步大家都没问题,可是两个进程都要进行下一步时,发现无法完成任务了:进程A已经锁上甲代码段,进程B没法再去操作它,同理进程B已经锁上乙代码段,进程A也没办法操作它,于是两个进程等待对方释放锁,当然,这样的等待也是无止无休的。这就好象两辆汽车在一座很榨的桥上相向行驶,两车碰头谁也不让谁,都在等待对方让路。避免死锁,必须使每次上锁操作都是有顺序的、原子的操作。有顺序的,也就是说每次都按照可执行队列地址从低向高的顺序上锁。
缺点:一个被争用的自旋锁使得请求它的线程在等待锁重新可用时自旋(特别浪费处理器时间)。所以,自旋锁不应该被长时间持有。
Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。
信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;另外当代码持有信号量时,不可以再持有自旋锁。
五 两者区别
虽然听起来两者之间的使用条件复杂,其实在实际使用中信号量和自旋锁并不易混淆。注意以下原则:
如果代码需要睡眠——这往往是发生在和用户空间同步时——使用信号量是唯一的选择。由于不受睡眠的限制,使用信号量通常来说更加简单一些。如果需要在自旋锁和信号量中作选择,应该取决于锁被持有的时间长短。理想情况是所有的锁都应该尽可能短的被持有,但是如果锁的持有时间较长的话,使用信号量是更好的选择。另外,信号量不同于自旋锁,它不会关闭内核抢占,所以持有信号量的代码可以被抢占。这意味者信号量不会对影响调度反应时间带来负面影响。
&&&&推荐文章:
【上篇】【下篇】Linux内核(33)
(1)内核同步措施
&&&&&&为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据的保护。
&&&&& Linux 使用的同步机制可以说从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随Linux从单处理器到对称多处理器的过度;伴随着从非抢占内核到抢占内核的过度。锁机制越来越有效,也越来越复杂。
&&&&& 目前来说内核中原子操作多用来做计数使用,其它情况最常用的是两种锁以及它们的变种:一个是自旋锁,另一个是信号量。我们下面就来着重介绍一下这两种锁机制。
(2)自旋锁
& &&& 自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,不需要自旋锁)。自旋锁最多只能被一个内核任务持有,如果一个内核任务试图请求一个已被占用(已经被持有)的自旋锁,那么这个任务就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被占用,请求它的内核任务便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的内核任务同时进入临界区,因此这种锁可有效地避免多处理器上并发运行的内核任务竞争共享资源。
&&&&&& 事实上,自旋锁的初衷就是:在短期间内进行轻量级的锁定。一个被占用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间),所以自旋锁不应该被持有时间过长。如果需要长时间锁定的话, 最好使用信号量。自旋锁的基本形式如下:
spin_lock(&mr_lock);
spin_unlock(&mr_lock);
&&&&&&& 因为自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。这点很好地满足了对称多处理机器需要的锁定服务。在单处理器上,自旋锁仅仅当作一个设置内核抢占的开关。如果内核抢占也不存在,那么自旋锁会在编译时被完全剔除出内核。实例:在一线背光调节时,由于脉冲变化时间过短,要保证控制脉冲的延时不被其他操作所中断或者拖延,使用自旋锁可起到作用。
DEFINE_SPINLOCK(g_handle_bk_lock);
unsigned long g_handle_bk_
spin_lock_irqsave(&g_handle_bk_lock, g_handle_bk_flag);
.....//需要保护的操作
spin_unlock_irqrestore(&g_handle_bk_lock, g_handle_bk_flag);   
(3)信号量
& &&& Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。
&&&&& 信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;另外当代码持有信号量时,不可以再持有自旋锁。信号量基本使用形式为:
static DEFINE_MUTEX(accdet_eint_irq_sync_mutex);
mutex_lock(&accdet_eint_irq_sync_mutex);
.............................
mutex_unlock(&accdet_eint_irq_sync_mutex);
(4)信号量和自旋锁区别
&&&& 虽然听起来两者之间的使用条件复杂,其实在实际使用中信号量和自旋锁并不易混淆。注意以下原则:如果代码需要睡眠——这往往是发生在和用户空间同步时——使用信号量是唯一的选择。如果需要在自旋锁和信号量中作选择,应该取决于锁被持有的时间长短。理想情况是所有的锁都应该尽可能短的被持有,但是如果锁的持有时间较长的话,使用信号量是更好的选择。另外,信号量不同于自旋锁,它不会关闭内核抢占,所以持有信号量的代码可以被抢占。这意味者信号量不会对影响调度反应时间带来负面影响。
自旋锁对信号量的比较:
&&& 需求场合&&&&&&&&&&&&&&&&&& 建议的加锁方法
低开销加锁&&&&&&&&&&&&&&&& 优先使用自旋锁
短期锁定&&&&&&&&&&&&&&&&&&& 优先使用自旋锁
长期加锁&&&&&&&&&&&&&&&&&&& 优先使用信号量
中断上下文中加锁&&&&&&&&&& 使用自旋锁
持有锁是需要睡眠、调度&&&& 使用信号量
参考原文:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2809048次
积分:25755
积分:25755
排名:第231名
原创:221篇
转载:214篇
评论:665条
(1)(1)(1)(2)(1)(3)(1)(1)(1)(1)(1)(3)(2)(2)(3)(1)(4)(1)(4)(1)(1)(1)(1)(6)(5)(5)(15)(2)(1)(4)(2)(1)(4)(3)(3)(6)(2)(1)(4)(1)(3)(5)(2)(11)(8)(4)(11)(6)(7)(11)(18)(8)(12)(6)(11)(10)(25)(37)(35)(16)(22)(16)(25)(11)(13)linuxn内核同步机制几种常用的方式,面试经常会被问道,这里做一个小结
【1】信号量
【2】互斥体
【3】自旋锁
1、信号量(semaphore)
又称为信号灯,本质上,信号量是一个计数器,用来记录对某个共享资源的存取情况,一般共享资源通过以下步骤
(1) 测试控制该资源的信号量(n)。
linuxn内核同步机制几种常用的方式,面试经常会被问道,这里做一个小结
【1】信号量
【2】互斥体
【3】自旋锁
1、信号量(semaphore)
又称为信号灯,本质上,信号量是一个计数器,用来记录对某个共享资源的存取情况,一般共享资源通过以下步骤
(1) 测试控制该资源的信号量(n)。
(2) 若此信号量的值为正,则允许进行使用该资源。进程将信号量减1。
(3) 若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1)。
(4) 当进程不再使用一个信号量控制的资源时,信号量值加1。如果此时有进程正在睡眠等待此信号量,则唤醒此进程。
以一个停车场的运作为例。简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入外面的一辆进去,如果又离开两辆,则又可以放入两辆,如此往复。在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用。
2、互斥体(mutex)
因此,在任意时刻,只有一个线程被允许进入这样的代码保护区。任何线程在进入临界区之前,必须获取(acquire)与此区域相关联的互斥体的所有权。如果已有另一线程拥有了临界区的互斥体,其他线程就不能再进入其中。这些线程必须等待,直到当前的属主线程释放(release)该互斥体。从原理上讲,mutex实际上是count=1情况下的semaphore
3、自旋锁(spin_lock)
保护共享资源的一种锁机制,解决资源的互斥使用,任意时刻只能有一个执行单元获得锁,这个互斥锁很像,但是在互斥锁中如果一个资源被占用资源申请者只能进入睡眠,但是自旋锁不会引起调用者的睡眠,而是一直在循环等待锁的保持者退出。
通常自旋锁适用于保持锁比较短的情形,正是由于自旋锁使用者时间很短因而”自旋“比睡眠更有优势,但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。,并且自旋锁不可递归调用
信号量/互斥体允许进程睡眠属于睡眠锁,自旋锁则不允许调用者睡眠,而是让其循环等待,所以有以下区别应用
1)、信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因而自旋锁适合于保持时间非常短的情况
2)、自旋锁可以用于中断,不能用于进程上下文(会引起死锁)。而信号量不允许使用在中断中,而可以用于进程上下文
3)、自旋锁保持期间是抢占失效的,自旋锁被持有时,内核不能被抢占,而信号量和读写信号量保持期间是可以被抢占的
转载:http://blog.csdn.net/xsf50717/article/details/
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】数据库技术天团集体亮相,分享一线生产实践经验,告诉你踩过的坑、走过的路,都是老司机,靠谱!干货分享,不可错过!&&
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高...
2017杭州云栖大会火热抢票
Loading...(梅很范儿)
(LUMO 互动科技)
(猎头张小姐)
第三方登录:

我要回帖

更多关于 自旋锁与信号量 的文章

 

随机推荐