linux 内核同步机制-自旋锁与信号量及其区别

转载 2012年03月23日 16:16:04

这篇文章写得很不错!新人值得一看:http://www.360doc.com/content/12/0222/15/8555864_188631419.shtml

内核同步措施

为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据的保护。 我们的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别。
Linux 使用的同步机制可以说从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随 Linux从单处理器到对称多处理器的过度;伴随着从非抢占内核到抢占内核的过度。锁机制越来越有效,也越来越复杂。
目前来说内核中原子操作多用来做计数使用,其它情况最常用的是两种锁以及它们的变种:一个是自旋锁,另一个是信号量。我们下面就来着重介绍一下这两种锁机制。


自旋锁
------------------------------------------------------
    自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,不需要自旋锁)。自旋锁最多只能被一个内核任务持有,如果一个内核任务试图请求一个已被争用(已经被持有)的自旋锁,那么这个任务就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求它的内核任务便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的内核任务同时进入临界区,因此这种锁可有效地避免多处理器上并发运行的内核任务竞争共享资源。
事实上,自旋锁的初衷就是:在短期间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间),所以自旋锁不应该被持有时间过长。如果需要长时间锁定的话, 最好使用信号量。
自旋锁的基本形式如下:
spin_lock(&mr_lock);
//临界区
spin_unlock(&mr_lock);

因为自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。这点很好地满足了对称多处理机器需要的锁定服务。在单处 理器上,自旋锁仅仅当作一个设置内核抢占的开关。如果内核抢占也不存在,那么自旋锁会在编译时被完全剔除出内核。
简单的说,自旋锁在内核中主要用来防止多处理器中并发访问临界区,防止内核抢占造成的竞争。另外自旋锁不允许任务睡眠(持有自旋锁的任务睡眠会造成自死锁——因为睡眠有可能造成持有锁的内核任务被重新调度,而再次申请自己已持有的锁),它能够在中断上下文中使用
死锁:假设有一个或多个内核任务和一个或多个资源,每个内核都在等待其中的一个资源,但所有的资源都已经被占用了。这便会发生所有内核任务都在相互等待, 但它们永远不会释放已经占有的资源,于是任何内核任务都无法获得所需要的资源,无法继续运行,这便意味着死锁发生了。自死琐是说自己占有了某个资源,然后 自己又申请自己已占有的资源,显然不可能再获得该资源,因此就自缚手脚了。


信号量
------------------------------------------------------
Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行 其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。
信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;另外当代码持有信号量时,不可以再持有自旋锁。

信号量基本使用形式为:
static DECLARE_MUTEX(mr_sem);//声明互斥信号量
if(down_interruptible(&mr_sem))
//可被中断的睡眠,当信号来到,睡眠的任务被唤醒 
//临界区
up(&mr_sem);


信号量和自旋锁区别
------------------------------------------------------
虽然听起来两者之间的使用条件复杂,其实在实际使用中信号量和自旋锁并不易混淆。注意以下原则:
如果代码需要睡眠——这往往是发生在和用户空间同步时——使用信号量是唯一的选择。由于不受睡眠的限制,使用信号量通常来说更加简单一些。如果需要在自旋 锁和信号量中作选择,应该取决于锁被持有的时间长短。理想情况是所有的锁都应该尽可能短的被持有,但是如果锁的持有时间较长的话,使用信号量是更好的选 择。另外,信号量不同于自旋锁,它不会关闭内核抢占,所以持有信号量的代码可以被抢占。这意味者信号量不会对影响调度反应时间带来负面影响。


自旋锁对信号量
------------------------------------------------------
需求                     建议的加锁方法

低开销加锁               优先使用自旋锁
短期锁定                 优先使用自旋锁
长期加锁                 优先使用信号量
中断上下文中加锁          使用自旋锁
持有锁是需要睡眠、调度     使用信号量


linux 内核同步机制-自旋锁与信号量及其区别

原文地址:http://www.360doc.com/content/12/0222/15/8555864_188631419.shtml 为了避免并发,防止竞争。内核提供了一组同步方法来提供对...
  • xiaohuima_dong
  • xiaohuima_dong
  • 2015年06月09日 10:47
  • 885

linux 内核信号量 用户态信号量 详解

Linux  内核中的信号量使用和用户态的信号量使用有所不同, 1、内核信号量,由内核控制路径使用。 2、用户态信号量分为两种,一种为POSIX,另一种为 SYSTEM V 内核中信号量的构成以...
  • weed_hz
  • weed_hz
  • 2013年05月23日 16:44
  • 7839

linux信号量简介(内核态)

一、什么是信号量     1、概念         内核的信号量在概念和原理上与用户态的信号量是一样的,但是它不能在内核之外使用。         信号量又称为信号灯(semaphore),本质上是一...
  • silent123go
  • silent123go
  • 2016年10月08日 21:21
  • 536

Linux内核源码之信号量的实现

之前的一片博客介绍了用于Linux内核同步的自旋锁,即使用自旋锁来保护共享资源,今天介绍另外一种Linux内核同步机制——信号量。信号量在内核中的使用非常广泛,用于对各种共享资源的保护。信号量与自旋锁...
  • u012603457
  • u012603457
  • 2016年10月30日 14:07
  • 637

Linux基础:信号量和互斥锁区别与联系

信号量与互斥锁 信号量与普通整型变量的区别:①信号量(semaphore)是非负整型变量,除了初始化之外,它只能通过两个标准原子操作:wait(semap) , signal(semap) ; 来进...
  • shaohua_lv
  • shaohua_lv
  • 2017年04月20日 12:32
  • 314

Linux信号量编程实例

http://blog.csdn.net/xiajun07061225/article/details/8475738 信号量概述 信号量定义: 它是一个特殊变量,只允许对它进行等待和发送信号这...
  • bytxl
  • bytxl
  • 2013年06月13日 09:08
  • 890

信号量、互斥体和自旋锁的区别

信号量/互斥体允许进程睡眠属于睡眠锁,自旋锁则不允许调用者睡眠,而是让其循环等待,所以有以下区别应用 1)、信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因而自旋锁适合...
  • zzhere2007
  • zzhere2007
  • 2013年06月17日 09:04
  • 4945

Linux内核IPC机制之信号量

Linux内核IPC机制之信号量 一.概述 Linux的IPC包括三种进程间的通信方式,信号量,消息队列,共享内存。它们都是通过内核起作用的。当某个进程使用到信号量的时候,它会进行信号量的创建...
  • lieye_leaves
  • lieye_leaves
  • 2014年11月25日 22:06
  • 1955

进程间通信之-信号量semaphore--linux内核剖析(十)

信号量什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。 信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线...
  • gatieme
  • gatieme
  • 2016年03月28日 23:37
  • 6197

Linux信号(signal) 机制和Linux信号量(semaphore)机制的区别

Linux信号(signal) 机制
  • langjian2012
  • langjian2012
  • 2014年10月01日 13:27
  • 4996
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux 内核同步机制-自旋锁与信号量及其区别
举报原因:
原因补充:

(最多只允许输入30个字)