自旋锁(spin lock)学习
目录
目的
用途
与互斥锁区别
相同点
不同点
原理
可能出现的问题
死锁(骑驴找驴)
过多占用cpu资源
使用场景
目的
为了防止多处理器并发,保护共享资源。
用途
在内核中大量用于中断处理。
对于单处理器,防止中断处理中的并发可以采用关闭中断的方式(标志寄存器中的中断标志位)
与互斥锁区别
相同点
- 为保护共享资源提出的锁机制:为了解决对某项资源的互斥使用。
- 在任何时刻,最多只能有一个执行单元获得锁。
- 一个执行单元要想访问被锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。
不同点
调度机制上不同:
对于互斥锁,如果资源已被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已被别的执行单元保持,调用者就一直循环等待。
原理
过程:
- 获取锁
- 访问共享资源
- 释放锁
如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即获取锁。
如果在获取锁时已经有持有者,那么锁操作将自旋,直到自旋锁的保持者释放了锁。
可能出现的问题
死锁(骑驴找驴)
试图递归地获得自旋锁必然会引起死锁:
递归程序的持有实例在第二个实例循环,以试图获得相同自旋锁时,不会释放此自旋锁。
在递归程序中使用自旋锁应遵守下列策略:
- 递归程序决不能在持有自旋锁时调用它自己
- 决不能在递归调用时试图获得相同的自旋锁
此外如果一个进程已经将资源锁定,那么,即使其它申请这个资源的进程不停地疯狂“自旋”,也无法获得资源,从而进入死循环。
过多占用cpu资源
如果不加限制,由于申请者一直在循环等待,因此自旋锁在锁定的时候,如果不成功,不会睡眠,会持续的尝试,单cpu的时候自旋锁会让其它process动不了. 因此,一般自旋锁实现会有一个参数限定最多持续尝试次数. 超出后, 自旋锁放弃当前time slice. 等下一次机会。
使用场景
自旋锁比较适用于锁使用者保持锁时间比较短的情况。
正是由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。
信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用,而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在内核可抢占或SMP(多处理器)的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。
总之,自旋锁是一种对多处理器相当有效的机制,而在单处理器非抢占式的系统中基本上没有作用。自旋锁在SMP系统中应用得相当普遍。
在许多SMP系统中,允许多个处理机同时执行目态程序,而一次只允许一个处理机执行操作系统代码,利用一个自旋锁可以很容易实现这种控制.一次只允许一个CPU执行核心代码并发性不够高,若期望核心程序在多CPU之间的并行执行,将核心分为若干相对独立的部分,不同的CPU可以同时进入和执行核心中的不同部分,实现时可以为每个相对独立的区域设置一个自旋锁.
自旋锁的基本形式如下:
spin_lock(&mr_lock);
//临界区
spin_unlock(&mr_lock);
自旋锁(spin lock)学习相关推荐
- mysql从库读取数据轮训,1.1.17 控制自旋锁Spin Lock轮训间隔
1.1.17 控制自旋锁Spin Lock轮训间隔 在介绍该特性之前,先来了解一下何谓自旋锁?它是为保护共享资源而提出的一种锁机制.其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用的 ...
- 自旋锁spin : spin_lock_irq , spin_lock_irqsave
Spinlock的目的是用来同步SMP中会被多个CPU同时存取的变量.在Linux中,普通的spinlock由于不带额外的语义,是用起来反而要非常小心. 在Linux kernel中执行的代码大体分n ...
- 自旋锁和互斥锁的区别 java中lock Syntronized区别
转载自:http://blog.csdn.net/susidian/article/details/51068858 自旋锁(Spin lock) 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠 ...
- linux进程--自旋锁和互斥锁的区别(十四)
自旋锁(Spin lock) 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是 否该自旋锁的保持者已经释放了锁,"自旋&qu ...
- 自旋锁、互斥锁和信号量
自旋锁 Linux内核中最常见的锁是自旋锁(spin lock).自旋锁最多只能被一个可执行线程持有.如果一个执行线程试图获得一个已经被持有的自旋锁,那么该线程就会一直进行忙循环--旋转--等待锁重新 ...
- kernel并发控制:自旋锁、互斥体、中断屏蔽
1. 中断屏蔽(关中断) 在单 CPU 范围内避免竞态的一种简单方法是在进入临界区之前屏蔽系统的中断. CPU 一般都具备屏蔽中断和打开中断的功能,这项功能可以保证正在执行的内核执行路径不被中断处理程 ...
- 内核并发控制---自旋锁(来自网易)
定义在头文件linux/spinlock.h中; 自旋锁(spin lock)是一种对临界资源进行互斥访问的典型手段;为了获得一个自旋锁,在某CPU上运行的代码需要首先执行一个原子操作,该操作测试并设 ...
- 驱动开发笔记1—内核中的事件、进程、线程、自旋锁
内核模式下的等待 KeWaitForSingleObject() 和 KeWaitForMultipleObjects() NTSTATUS KeWaitForSingleObject(IN PVOI ...
- spin_lock 自旋锁
自旋锁 Spin lock 的实现是为了保护一段短小的临界区操作代码,保证这个临界区的操作是原子的,从而避免并发的竞争冒险.在Linux内核中,自旋锁通常用于包含内核数据结构的操作,你可以看到在许多内 ...
最新文章
- jquery API
- POCO:InvalidOperationError:Mapping and metadata information could not be found for Entity Type
- 二、lvm条带化的概念
- python 库列表_python库安装列表
- android 8 wifi 不稳定,Android 8.0又背锅?网络兼容问题导致WiFi狂掉线
- Responsive Web Design
- 【BIEE】超过了已配置的最大允许输入记录数
- java 删除目录下所有文件_Java删除文件、目录及目录下所有文件的方法实例
- C-Free 5.0注册码分享
- word计算机基础知识试题及答案,计算机基础知识试题及答案(一)
- 决策树模型(R语言)
- Oracle nlssort()中文排序
- 你真正理解什么是“财富自由吗”?
- D. Binary Spiders(思维+字典树)
- 实时视频流:工作原理
- Python识别图形验证码
- 第十一章 文件操作_C语言fopen函数的用法,C语言打开文件详解
- Java设计模式入门
- 使用restormer网络做2022年中兴捧月图像去噪
- (通俗易懂小白入门)网络流最大流——EK算法