信号量、互斥体和自旋锁小结

概述

linuxn内核同步机制几种常用的方式,面试经常会被问道,这里做一个小结

【1】信号量

【2】互斥体

【3】自旋锁

【4】区别

1、信号量(semaphore)

又称为信号灯,本质上,信号量是一个计数器,用来记录对某个共享资源的存取情况,一般共享资源通过以下步骤

(1) 测试控制该资源的信号量(n)。

   (2) 若此信号量的值为正,则允许进行使用该资源。进程将信号量减1。

   (3) 若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1)。

   (4) 当进程不再使用一个信号量控制的资源时,信号量值加1。如果此时有进程正在睡眠等待此信号量,则唤醒此进程。

以一个停车场的运作为例。简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入外面的一辆进去,如果又离开两辆,则又可以放入两辆,如此往复。在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用。

2、互斥体(mutex)

因此,在任意时刻,只有一个线程被允许进入这样的代码保护区。任何线程在进入临界区之前,必须获取(acquire)与此区域相关联的互斥体的所有权。如果已有另一线程拥有了临界区的互斥体,其他线程就不能再进入其中。这些线程必须等待,直到当前的属主线程释放(release)该互斥体。从原理上讲,mutex实际上是count=1情况下的semaphore

3、自旋锁(spin_lock)

保护共享资源的一种锁机制,解决资源的互斥使用,任意时刻只能有一个执行单元获得锁,这个互斥锁很像,但是在互斥锁中如果一个资源被占用资源申请者只能进入睡眠,但是自旋锁不会引起调用者的睡眠,而是一直在循环等待锁的保持者退出。

通常自旋锁适用于保持锁比较短的情形,正是由于自旋锁使用者时间很短因而”自旋“比睡眠更有优势,但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。,并且自旋锁不可递归调用

4、区别

信号量/互斥体允许进程睡眠属于睡眠锁,自旋锁则不允许调用者睡眠,而是让其循环等待,所以有以下区别应用

1)、信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因而自旋锁适合于保持时间非常短的情况

2)、自旋锁可以用于中断,不能用于进程上下文(会引起死锁)。而信号量不允许使用在中断中,而可以用于进程上下文

3)、自旋锁保持期间是抢占失效的,自旋锁被持有时,内核不能被抢占,而信号量和读写信号量保持期间是可以被抢占的

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 21:38:14

信号量、互斥体和自旋锁小结的相关文章

信号量、互斥体和自旋锁

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/21/2602015.html 信号量.互斥体和自旋锁 一.信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信.本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况.一般说来,为了获得共享资源,进程需要执行下列操作:  (1) 测试控制该资源的信号量.  (2) 若此信号量的值为正,则允许进行使用该资源.进程将信号量减1.

互斥体与互锁 <第五篇>

互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex)).互斥体禁止多个线程同时进入受保护的代码“临界区”.因此,在任意时刻,只有一个线程被允许进入这样的代码保护区. 任何线程在进入临界区之前,必须获取(acquire)与此区域相关联的互斥体的所有权.如果已有另一线程拥有了临界区的互斥体,其他线程就不能再进入其中.这些线程必须等待,直到当前的属主线程释放(release)该互斥体.什么时候需要使用互斥体呢?互斥体用于保护共享的易变代码,也就是,全

本地自旋锁与信号量/多服务台自旋队列-spin wait风格的信号量

周日傍晚,我去家附近的超市(...)买苏打水,准备自制青柠苏打.我感觉我做的比买的那个巴黎水要更爽口.由于天气太热,非常多人都去超市避暑去了,超市也不撵人,这仿佛是他们的策略.人过来避暑了,走的时候难免要买些东西的.就跟非常多美女在公交地铁上看淘宝消磨时光,然后就下单了...这是多么easy一件事,反之开车的美女网购就少非常多.对于超市的避暑者,要比公交车上下单更麻烦些,由于有一个成本问题,这就是排队成本.       其实这是一个典型的多服务台排队问题,可是超市处理的并不好.存在队头拥塞问题.

多线程编程之自旋锁

一.什么是自旋锁 一直以为自旋锁也是用于多线程互斥的一种锁,原来不是! 自旋锁是专为防止多处理器并发(实现保护共享资源)而引入的一种锁机制.自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用.无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁.但是两者在调度机制上略有不同.对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态.但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁

浅析线程间通信二:读写锁和自旋锁

上文讨论了互斥量和条件变量用于线程的同步,本文将讨论读写锁和自旋锁的使用,并给出了相应的代码和注意事项,相关代码也可在我的github上下载. 读写锁 对于互斥量要么是锁住状态要么是不加锁锁状态,而且一次只有一个线程可以对其加锁,而读写锁对线程的读数据加锁请求和写数据加锁请求进行了区分,从而在某些情况下,程序有更高的并发性.对于读写锁,一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁.虽然读写锁的实现各不相同,但当读写锁处于读模式锁住状态时,如果有另外的线程试图以写

linux驱动之 信号量 自旋锁 互斥体

原子操作 原子操作就是单位操作,也就是说操作过程不能被中断 下面代码中每条语句看起来是原子操作,其实不是原子操作: int main(0 { int i=2;//两天汇编语句组成 i=i+3;//三条汇编语句组成 } 实现原子操作方法; 1  自旋锁 自旋锁它是为为实现保护共享资源而提出一种锁机制.其实,自旋锁与互斥锁比较类似 ,它们都是为了解决对某项资源的互斥使用.无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁.但是两者在调度机制上略

linux驱动开发(十一)linux内核信号量、互斥锁、自旋锁

参考: http://www.360doc.com/content/12/0723/00/9298584_225900606.shtml http://www.cnblogs.com/biyeymyhjob/archive/2012/07/21/2602015.html http://blog.chinaunix.net/uid-25100840-id-3147086.html http://blog.csdn.net/u012719256/article/details/52670098 --

信号量、互斥锁、自旋锁

信号量: 是用来解决进程/线程之间的同步和互斥问题的一种通信机制,是用来保证两个或多个关键代码不被并发调用. 信号量(Saphore)由一个值和一个指针组成,指针指向等待该信号量的进程.信号量的值表示相应资源的使用情况.信号量S>=0时,S表示可用资源的数量.执行一次P操作意味着请求分配一个资源,因此S的值减1:当S<0时,表示已经没有可用资源,S的绝对值表示当前等待该资源的进程数.请求者必须等待其他进程释放该类资源,才能继续运行.而执行一个V操作意味着释放一个资源,因此S的值加1:若S<

信号量,互斥锁,自旋锁

个人理解: 信号量(进程间的通信机制(单一个数的信号),与消息邮箱,消息队列,机理类同,量不同,)用信号量肯定掉cpu: 自旋锁:保护区域不掉cpu,持续查找,等待(不可用时域长状态): 切记: 时域范围: 在进程间的通信机制函数状态 ∩ 锁 = 0: 互斥锁与自旋锁 互斥锁:线程会从sleep(加锁)-->running(解锁),过程中有上下文的切换,cpu的抢占,信号的发送等开销. 自旋锁:线程一直是running(加锁-->解锁),死循环检测锁的标志位,机制不复杂. 自旋锁 == whi