linux内核同步方式--自旋锁

原创 2012年03月21日 11:05:29

自旋锁:是linux内核中最常见的锁,自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图获得一个被持有的自旋锁,那么该线程会一直进行忙循环,旋转,等待锁重新可用.


在任何时候,自旋锁都可以防止多于一个的执行线程同时进入临界区,一个被争用的自旋锁会导致请求他的线程在等待锁重新可用时自旋,所以自旋锁不应被长期持有.这也是自旋锁的初衷:在短期内进行轻量级加锁.
自旋锁的实现与体系结构密切相关,代码往往通过汇编实现.这些与体系结构相关的代码定义在<asm/spinlock.h>文件中,实际会使用到的接口是<linux/spinlock.h>文件中,自旋锁的基本使用形式是:
spinlock_t mr_lock = SPIN_LOCK_UNLOCKED;

spin_lock(&mr_lock);
/*
临界区
*/
spin_unlock(&mr_lock);
因为自旋锁同一时刻最多只能被一个执行线程持有,所以同一个时刻只会有一个线程处于临界区内,这就为多处理器提供了防止并发访问所需要的保护机制.

自旋锁也可以用在中断处理程序中,在中断处理程序使用自旋锁之前,一定要先进制本地中断,否则,中断处理程序就会打断正持有锁的内核代码,有可能会去争用这个被持有的自旋锁,但是锁的持有者在这个中断处理程序结束之前不能运行,从而造成了死锁.

内核提供的进制中断同时请求锁的接口:
spinlock_t mr_lock = SPIN_LOCK_UNLOCKED;

unsigned long flags;
spin_lock_irqsave(&mr_lock,flags);
/*
临界区
*/
spin_lock_irqrestore(&mr_lock,flags);
解释:
spin_lock_irqsave()保存中断的当前状态,并禁止本地中断,然后再去获得指定的锁,而spin_lock_irqrestore()是对指定的锁解锁,并让她恢复到加锁前的状态.

针对自旋锁的操作:
spin_lock_init()用来初始化动态创建的自旋锁,此时你只有一个指向spinlock_t类型的指针,并没有它的实体.
spin_try_lock()试图获得某个特定的自旋锁,如果该锁已经被争用,该方法会立刻返回一个非0值,而不会自旋等待锁被释放,如果成果获得了这个锁,那么就返回0.
spin_is_locked()方法和spin_try_lock()是一样的功效,该方法只做判断,并不生效.
spin_lock();//获取指定的自旋锁
spin_lock_irq();//禁止本地中断获取指定的锁
spin_lock_irqsave();//保存本地中断的状态,禁止本地中断,并获取指定的锁
spin_unlock();//释放指定的锁
spin_unlock_irq();//释放指定的锁,并激活本地中断
spin_unlock_irqrestore();//释放指定的锁,并让本地中断恢复到以前的状态
spin_lock_init();//初始化指定的spinlock_t
spin_try_lock();//试图获取指定的锁,如果未获取,则返回非0
spin_is_locked();//和try_lock()差不多

有很多时候锁的用途可以明确的分为读取和写入,比如说读写链表,因此linux就专门的提供了读-写自旋锁,这种锁为读和写分别提供了不同的锁:一个或多个读任务可以并发的持有读者锁,相反用于写的锁最多只能被一个写任务持有,而且此时不能有并发的读操作.

 

读/写自旋锁的使用方法类似于普通自旋锁,它们通过下面的方法初始化,具体的方法就不详细述说了.
需要注意的两点:自旋锁不能递归,防止死锁的产生.


linux内核同步方式--自旋锁

自旋锁:是linux内核中最常见的锁,自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图获得一个被持有的自旋锁,那么该线程会一直进行忙循环,旋转,等待锁重新可用. 在任何时候,自旋锁都可以防止...
  • swliao
  • swliao
  • 2010年11月13日 17:33
  • 2227

linux内核同步(3)--自旋锁

自旋锁最多只能由一个可执行线程执有,因此其可以防止多于一个的执行线程同时进入临界区。自旋锁因为占用处理器资源,所以不应该被长时间执有。与自旋锁相比,信号量会有两次明显的上下文切换,阻塞的线程要换出与换...
  • pumpkinhill
  • pumpkinhill
  • 2014年11月08日 14:29
  • 402

Linux内核同步方式总结

阅读《深入理解linux内核》笔记 内核抢占:如果进程正在执行内核函数时(即它在内核态运行时),允许发生内核切换(被替换的进程是正在执行内核函数的进程),这个内核就是抢占的。 运行在内核态的进程可以自...
  • yyf_it
  • yyf_it
  • 2016年09月02日 21:49
  • 710

Linux内核自旋锁

自旋锁 自旋锁(spinlock)是用在多个CPU系统中的锁机制,当一个CPU正访问自旋锁保护的临界区时,临界区将被锁上,其他需要访问此临界区的CPU只能忙等待,直到前面的CPU已访问完临界区,将...
  • Tommy_wxie
  • Tommy_wxie
  • 2012年02月22日 14:33
  • 7103

Linux内核中的同步

版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127   如果一个进程正处于临界区时被非自愿抢占了,而且这个新调度的进程随后也进入同一个临界区,前后两个进程...
  • weiqing1981127
  • weiqing1981127
  • 2012年12月14日 08:58
  • 1766

LINUX自旋锁详解

加锁(locking)是一种广泛应用的同步技术。当内核控制路径必须访问共享数据结构或进入临界区时,就需要为自己获取一把“锁”。由锁机制保护的资源非常类似于限制于房间内的资源,当某人进入房间时,就把门锁...
  • DLUTBruceZhang
  • DLUTBruceZhang
  • 2013年08月21日 17:02
  • 3041

操作系统概念-内核同步-自旋锁

有了原子操作,就可以了制作控制临界区的锁机制了。自旋锁就是其中的一个代表。 自旋锁机制可以用门和锁的例子来比喻。进程执行到某个临界区,相当于要进入一栋房子,这是进程会检查屋内是否有人(进程),如果屋...
  • u010281174
  • u010281174
  • 2017年01月06日 15:47
  • 142

linux内核自旋锁总结

1、自旋锁实现: 自旋锁是一个互斥设备,它只有两个值:“锁定”和“解锁”。它通常实现为某个整数值中的某个位。希望获得某个特定锁得代码测试相关的位。如果锁可用,则“锁定”被设置,而代码继续进入临界区;相...
  • xiaoaide01
  • xiaoaide01
  • 2016年07月06日 16:29
  • 1081

Linux 自旋锁

1.什么是自旋锁 自旋锁顾名思义首先是一把锁,另外使用这把锁的线程需要反复自我循环(loop)检测这把锁是否可用。 注意与信号量区别,信号量也是一把锁,但是使用这把锁的线程检测锁不可用时,选择去睡...
  • xiaofei0859
  • xiaofei0859
  • 2014年04月14日 00:01
  • 2128

linux自旋锁——读写锁

在一些程序中存在读者写者问题,也就是说,对某些资源的访问会 存在两种可能的情况,一种是访问必须是排它性的,就是独占的意思,这称作写操作;另一种情况就是访问方式可以是共享的,就是说可以有多个线程同时去访...
  • qq_36221862
  • qq_36221862
  • 2017年04月07日 18:30
  • 279
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux内核同步方式--自旋锁
举报原因:
原因补充:

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