Linux设备驱动---自旋锁
来源:互联网 发布:淘宝上美的官方旗舰店 编辑:程序博客网 时间:2024/05/18 17:02
自旋锁的工作:
从保证临界区访问原子性的目的来考虑,自旋锁应该阻止在代码运行过程中出现的任何并发干扰从而保证他的原子性。这些“干扰”包括:
1、中断,包括硬件中断和软件中断 (仅在中断代码可能访问临界区时需要)
这种干扰存在于任何系统中,一个中断的到来导致了中断例程的执行,如果在中断例程中访问了临界区,原子性就被打破了。所以如果在某种中断例程中存在访问某个临界区的代码,那么就必须用spinlock保护。对于不同的中断类型(硬件中断和软件中断)对应于不同版本的自旋锁实现,其中包含了中断禁用和开启的代码。但是如果你保证没有中断代码会访问临界区,那么使用不带中断禁用的自旋锁API即可。
2、内核抢占(仅存在于可抢占内核中)
在2.6以后的内核中,支持内核抢占,并且是可配置的。这使UP系统和SMP类似,会出现内核态下的并发。这种情况下进入临界区就需要避免因抢占造成的并发,所以解决的方法就是在加锁时禁用抢占(preempt_disable(); ),在开锁时开启抢占(preempt_enable();注意此时会执行一次抢占调度) 。
3、 其他处理器对同一临界区的访问 (仅SMP系统)
在SMP系统中,多个物理处理器同时工作,导致可能有多个进程物理上的并发。这样就需要在内存加一个标志,每个需要进入临界区的代码都必须检查这个标志,看是否有进程已经在这个临界区中。这种情况下检查标志的代码也必须保证原子和快速,这就要求必须精细地实现,正常情况下每个构架都有自己的汇编实现方案,保证检查的原子性。
自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。
该宏声明一个自旋锁x并初始化它。该宏在2.6.11中第一次被定义,在先前的内核中并没有该宏。
该宏用于静态初始化一个自旋锁。
该宏用于判断自旋锁x是否已经被某执行单元保持(即被锁),如果是,返回真,否则返回假。
该宏用于等待自旋锁x变得没有被任何执行单元保持,如果没有任何执行单元保持该自旋锁,该宏立即返回,否则将循环在那里,直到该自旋锁被保持者释放。
该宏尽力获得自旋锁lock,如果能立即获得锁,它获得锁并返回真,否则不能立即获得锁,立即返回假。它不会自旋等待lock被释放。
该宏用于获得自旋锁lock,如果能够立即获得锁,它就马上返回,否则,它将自旋在那里,直到该自旋锁的保持者释放,这时,它获得锁并返回。总之,只有它获得锁才返回。
该宏获得自旋锁的同时把标志寄存器的值保存到变量flags中并失效本地中断。(由于要关中断,所以flags中的保存的时关中断之前的中断状态,个人理解可能是一些中断寄存器中的值。)
该宏类似于spin_lock_irqsave,只是该宏不保存标志寄存器的值。
该宏在得到自旋锁的同时失效本地软中断。
该宏释放自旋锁lock,它与spin_trylock或spin_lock配对使用。如果spin_trylock返回假,表明没有获得自旋锁,因此不必使用spin_unlock释放。
该宏释放自旋锁lock的同时,也恢复标志寄存器的值为变量flags保存的值。注意他只是回复标志寄存器的值没有使能中断它与spin_lock_irqsave配对使用。
该宏释放自旋锁lock的同时,也使能本地中断。它与spin_lock_irq配对应用。
该宏释放自旋锁lock的同时,也使能本地的软中断。它与spin_lock_bh配对使用。
因此如果能够立即获得锁,它等同于spin_lock_irqsave,如果不能获得锁,它等同于spin_trylock。如果该宏获得自旋锁lock,那需要使用spin_unlock_irqrestore来释放。
该宏如果获得了自旋锁,它也将失效本地软中断。如果得不到锁,它什么也不做。因此,如果得到了锁,它等同于spin_lock_bh,如果得不到锁,它等同于spin_trylock。如果该宏得到了自旋锁,需要使用spin_unlock_bh来释放。
该宏用于判断自旋锁lock是否能够被锁,它实际是spin_is_locked取反。如果lock没有被锁,它返回真,否则,返回假。该宏在2.6.11中第一次被定义,在先前的内核中并没有该宏。
spin_lock用于阻止在不同CPU上的执行单元对共享资源的同时访问以及不同进程上下文互相抢占导致的对共享资源的非同步访问,而中断失效和软中断失效却是为了阻止在同一CPU上软中断或中断对共享资源的非同步访问。
- Linux设备驱动---自旋锁
- Linux 设备驱动--- 并发 之- 自旋锁
- linux驱动开发--字符设备:自旋锁
- linux设备驱动--并发与竞态之自旋锁
- 《Linux设备驱动开发详解》-- 自旋锁(spinlock)
- Linux设备驱动三 (1)自旋锁,信号量
- linux驱动 自旋锁
- 设备驱动-----并发控制--自旋锁
- 字符设备驱动第八课----自旋锁
- Linux 设备驱动 ====> 并发控制 --- 自旋锁
- Linux 设备驱动 ====> 并发控制 --- 自旋锁
- linux设备驱动并发控制--自旋锁和信号量应用区别
- Linux设备驱动第七天(原子性:中断屏蔽、自旋锁、信号量)
- Linux设备驱动中的并发控制,原子打操作、自旋锁、信号量、完成量、互斥体
- Linux 设备驱动 ====> 并发控制 --- 自旋锁
- Linux驱动之自旋锁、读写自旋锁
- linux驱动之 信号量 自旋锁 互斥体
- linux驱动之自旋锁(spinlock)
- C++11中的匿名函数(lambda函数,lambda表达式)
- busybox安装过程
- CImageList使用指南
- 类的成员函数和全局函数的互相调用
- Silverlight for ArcGIS 经纬度定位
- Linux设备驱动---自旋锁
- 华为2014年机试题【输入1--50个数字,求出最小数和最大数的和】
- excel关闭按钮不能退出
- 数据结构的排序算法(直接插入)
- MongoDB在windows下的安装配置
- 面试题之interleave字符串分析
- Android源码编译整理总结
- 在 Sandboxed Mac App 中嵌入第三方可执行文件
- 类模板(3种)