自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave
自旋锁和互斥锁的区别是,自旋锁不会引起睡眠,所以可用于不能休眠的代码中(如IRQ)
自旋锁保持期间抢占失效,而信号量保持期间可以被抢占
定义
spinlock_t lock;
init
#define spin_lock_init(_lock) \
do { \
spinlock_check(_lock); \
raw_spin_lock_init(&(_lock)->rlock); \
} while (0)
获得
static inline void spin_lock(spinlock_t *lock)
static inline int spin_trylock(spinlock_t *lock)
spin_lock:获得锁以后,立即返回,否则,它将自旋在那里,直到该自旋锁的保持者释放
spin_trylock:获得锁失败,立即返回假
释放
static inline void spin_unlock(spinlock_t *lock)
举例
spinlock_t lock;
spin_lock_init(&lock)
...
critical section
...
spin_unlock(&lock)
其他
尽管自旋锁可以保证临界区不受别的CPU和本CPU抢占进程打扰,但是得到锁的代码在执行临界区的时候,还可能受到中断和底半部的影响
static inline void spin_lock_irq(spinlock_t *lock)
#define spin_lock_irqsave(lock, flags)
static inline void spin_lock_bh(spinlock_t *lock)
static inline void spin_unlock_irq(spinlock_t *lock)
static inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
static inline void spin_unlock_bh(spinlock_t *lock)
spin_lock_irq() = spin_lock() + local_irq_disable()
spin_lock_irqsave() = spin_lock() + local_irq_save()
spin_lock_bh() = spin_lock() + local_bh_disable()
spin_unlock_irq() = spin_unlock() + local_irq_enable()
spin_unlock_irqrestore() = spin_unlock() + local_irq_restore()
spin_unlock_bh = spin_unlock() + local_bh_enable()local_irq_disable:关中断
local_irq_save:关中断并保存状态字
local_bh_disable:关底半部
local_irq_enable:开中断
local_irq_restore:开中断并恢复状态字
local_bh_enable:开底半部
在任何情况下使用spin_lock_irq都是安全的。因为它既禁止本地中断,又禁止内核抢占
spin_lock比spin_lock_irq速度快,但是它并不是任何情况下都是安全的
spin_lock_irqsave
- 保存本地中断状态
- 关闭本地中断
- 获取自旋锁
spin_unlock_irqrestore
- 释放锁
- 恢复本地中断
注:读写自旋锁待补充
自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave的更多相关文章
- 自旋锁spin_lock和raw_spin_lock
自旋锁spin_lock和raw_spin_lock Linux内核spin_lock.spin_lock_irq 和 spin_lock_irqsave 分析 http://blog.csdn.ne ...
- 自旋锁spin_lock和raw_spin_lock【转】
转自:http://blog.csdn.net/droidphone/article/details/7395983 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 临界区Cr ...
- [内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析
转自:http://blog.csdn.net/wh_19910525/article/details/11536279 自旋锁的初衷:在短期间内进行轻量级的锁定.一个被争用的自旋锁使得请求它的线程在 ...
- [内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析【转】
转自:https://www.cnblogs.com/x_wukong/p/8573602.html 转自;https://www.cnblogs.com/aaronLinux/p/5890924.h ...
- LINUX内核笔记:自旋锁
目录 自旋锁作用与基本使用方法? 在SMP和UP上的不同表现? 自旋锁与上下文 使用spin_lock()后为什么不能睡眠? 强调:锁什么? 参考 1.自旋锁作用与基本使用方法? 与其他锁一样,自 ...
- 漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?(转)
知乎链接:https://zhuanlan.zhihu.com/p/57354304 1. 锁的由来? 学习linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可 ...
- Linux 内核同步之自旋锁与信号量的异同【转】
转自:http://blog.csdn.net/liuxd3000/article/details/8567070 Linux 设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发访问会导 ...
- spin_lock、spin_lock_irq、spin_lock_irqsave区别【转】
转自:http://blog.csdn.net/luckywang1103/article/details/42083613 void spin_lock(spinlock_t *lock); voi ...
- spin_lock、spin_lock_irq、spin_lock_irqsave区别
void spin_lock(spinlock_t *lock); void spin_lock_irq(spinlock_t *lock); void spin_lock_irqsave(spinl ...
随机推荐
- 使用Alibaba的Nacos做为SpringCloud的注册和配置中心,并结合Sentinel+Nocos动态进行限流熔断
最近在学习阿里的Nacos组件以及Sentinel组件,折腾出了一个小demo. Git地址:https://github.com/yangzhilong/nacos-client 有兴趣的小伙伴可以 ...
- pycharm把制表符(tab)转换为空格(PEP8)
pycharm把制表符转换为4个空格 pycharm显示空格
- Spring项目读取resource下的文件
目录 一.前提条件 二.使用ClassPathResource类读取 2.1.Controller.service中使用ClassPathResource 2.2.单元测试使用ClassPathRes ...
- iOS - 截取数组前几个元素放入新的数组,剩余的放入另外一个数组
NSArray *array = [NSArray arrayWithObjects:@"Crystal",@"Maisie",@"Lukas&quo ...
- [Golang] go modules使用
关于go modules的使用外面的教程实在太多了,我这里只讲下我自己使用的三种情形. 准备工作: 1.新建个文件加gomod_test. 2.在这个目录输入命令 go mod init gomod_ ...
- 搭建FTP(win10版)以及基本FTP操作
参考链接:https://www.jianshu.com/p/ece21421e246 一.FTP服务器搭建 控制面板 - 程序和功能 - 启动或关闭Windows功能 启动以下功能: 搜索 “Int ...
- go 单元测试框架介绍
最近项目在补充单元测试,这里介绍以下几个go里流行的单元测试框架. gomock gostub monkey Convey 下面介绍下各个框架的主要用途 convey 主要用途是用来组织测试用例的 g ...
- CentOS7.5 使用二进制程序部署Kubernetes1.12.2(三)
一.安装方式介绍 1.yum 安装 目前CentOS官方已经把Kubernetes源放入到自己的默认 extras 仓库里面,使用 yum 安装,好处是简单,坏处也很明显,需要官方更新 yum 源才能 ...
- nodejs调试工具 node-inspect
1.安装 npm install -g node-inspect 2.chrome设置 chrome://flags/#enable-devtools-experiments 3.测试 测试代码mai ...
- CentOS 5 源
# The mirror system uses the connecting IP address of the client and the # update status of each mir ...