Linux内核自旋锁使用笔记
Reference:
spin_lock_bh()与spin_unlock_bh()
Linux内核自旋锁
Linux自旋锁
Spinlock - Wikipedia, the free encyclopedia
本文地址:https://segmentfault.com/a/1190000005354100
原理
首先,spinlock是一把锁,它的功能与其他锁的作用类似,都是对用于临界区进行原子读写。使用这把锁时,原理上就是不停的循环检查锁的状态,直到可用的时候进入临界区。
与mutex的区别
Spinlock只进行虚幻检查,在内核中仍然允许抢占。
Mutex会立即引起调度,因而在一些中断处理函数中会出问题。
注意:
由于是循环检查而已,因此临界区的大小应该限制,否则非常影响效率。
选择自旋锁时,要注意考虑中断(软中断与硬中断;timer中断属于软中断)
函数和宏定义
头文件
#include <linux/spinlock.h>
静态初始化
spinlock_t a_lock = SPIN_LOCK_UNLOCKED;
宏定义和函数
动态初始化:
spin_lock_init(&a_lock);
判断自旋锁是否上锁:
spin_is_locked(&a_lock);
等待直到spinlock解锁
spin_unlock_wait(&a_lock);
进入和退出临界区
spin_lock(&a_lock);
spin_unlock(&a_lock);
保存状态寄存器值地进入和退出临界区
int flags;
spin_lock_irqsave(&a_lock, flags);
spin_unlock_irqrestore(&a_lock, flags);
屏蔽硬件中断地进入和退出临界区
spin_lock_irq(&a_lock);
spin_unlock_irq(&a_lock);
屏蔽底半部中断地进入和退出临界区
spin_lock_bh(&a_lock);
spin_unlock_bh(&a_lock);
Linux内核自旋锁使用笔记相关推荐
- php 自旋锁,Linux内核自旋锁使用笔记
原理 首先,spinlock是一把锁,它的功能与其他锁的作用类似,都是对用于临界区进行原子读写.使用这把锁时,原理上就是不停的循环检查锁的状态,直到可用的时候进入临界区. 与mutex的区别 Spin ...
- linux 内核 死锁 检查,一种linux内核自旋锁死锁检测报告系统和方法与流程
本发明涉及内核死锁检测领域,具体的说是一种linux内核自旋锁死锁检测报告系统和方法. 背景技术: linux内核死锁是长期困扰内核开发人员的问题之一,但自内核引入lockdep调试模块之后,内核死锁 ...
- Linux内核自旋锁
Linux内核自旋锁 自旋锁 自旋锁(spinlock)是用在多个CPU系统中的锁机制,当一个CPU正访问自旋锁保护的临界区时,临界区将被锁上,其他需要访问此临界区的CPU只能忙等待,直到前面的CPU ...
- linux内核自旋锁解释,LINUX内核笔记:自旋锁
目录 1.自旋锁作用与基本使用方法? 与其他锁一样,自旋锁也用于保护临界区,但是自旋锁主要是用于在SMP上保护临界区.在SMP上,自旋锁最多只能被一个可执行线程持有,如果一个线程尝试获得一个被争用的自 ...
- Linux 内核自旋锁
为什么需要内核自旋锁? 现在很多CPU都是几核几核的了,如果有一个变量A,CPU-X正在访问,突然CPU-Y也过来访问他,这时候就可能出现问题,因为这个A非常重要,可能导致系统崩溃,中断异常等. 我们 ...
- linux内核自旋锁API
我们大概都了解,锁这种机制其实是为了保护临界区代码的,关于使用和定义,我总结的API如下: #include <linux/spinlock.h>定义自旋锁 spinlock_t lock ...
- linux内核 自旋锁示例,自旋锁(示例代码)
一.什么是自旋锁 一直以为自旋锁也是用于多线程互斥的一种锁,原来不是! 自旋锁是专为防止多处理器并发(实现保护共享资源)而引入的一种锁机制.自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用 ...
- linux内核自旋锁的代码分析
前面看操作系统导论这本书,其中锁的历史变化有点感悟,现在追一下linux内核锁的代码. 一.自旋锁 1.锁的结构体 系统自旋锁结构体如下: typedef struct spinlock {union ...
- Linux ARM平台开发系列讲解(自旋锁) 3.3.1 Linux内核自旋锁描述
1. 概述 原子操作只能对整形变量或者位进行保护,但是,在实际的使用环境中怎么可能只有整形变量或位这么简单的临界区.举个最简单的例子,设备结构体变量就不是整型变量,我们对于结构体中成员变量的操作也要保 ...
最新文章
- 现代内存编号解读(转)
- 正则表达式基础(一)
- Eclipse中使用Git
- python交互式编程入门先学什么_为什么 Python 对于编程入门学习来说,是一门很棒的语言...
- sqlplus(数据泵)导入导出dmp实践使用
- php 增加mysql 索引,【PHP】为什么 MySQL 添加索引后就可以提高查询速度
- JavaScript 编程精解 中文第三版 七、项目:机器人
- WCF Ria Service“操作失败,指定的命名链接在配置中找不到”错误解决方法
- ati.c ATI顯卡開發源代碼
- js 获取浏览器 滚动的高度
- 操作系统介绍,为什么使用虚拟机,虚拟机使用原理透彻解释
- 打开ps显示计算机内存不足怎么办,如何解决PS内存不足的问题
- html botton定位的俩种方法
- CSRF与钓鱼链接攻击
- 基于 Selenium 掘金自动签到、抽奖的定时任务
- design pattern : Facade
- [ANT]apache ant 安装说明
- LATEX以及宏包的下载和安装(附下载链接)
- Virgo与Maven整合开发环境搭建(三)
- 全球首位数字航天员“小诤”亮相中国空间站;湖南三安半导体产业园项目投产 | 全球TMT...
热门文章
- 图像偏色检测算法,速度快,效果好,共享给大家。
- 润乾报表新功能静态页面和report4包分离
- 牛客第七场 Sudoku Subrectangles
- Github上如何在组织中创建代码仓库,并如何授予该组织中某个小组权限?
- CCommandLineInfo类
- mysql主从复制实战
- 系统权限管理设计 (转:http://blog.csdn.net/chexlong/article/details/37697555)
- 标准C++中string类用法总结
- apache 启动故障(httpd: apr_sockaddr_info_get() failed fo)
- vue+elementUI项目的踩坑~~持续更新