Linux 内核的锁机制
概要:
锁机制是一种保护共享资源不被多次访问的一种机制。共享资源可以是数据(如:全局变量)也可以是设备(如:GPIO)。
Linux锁的种类:
●互斥锁
●自旋锁
●信号量
本文只对前两种锁进行说明。
互斥锁:
顾名思义,对资源的访问是互斥的。例如:一个线程访问了(lock)一种资源,那么其他线程就不能访问,直到锁被释放(unlock)。
原理:
竞争线程从调度器的运行队列中移出,放入处于睡眠状态的等待链表中。然后内核调度并执行其他任务。当锁被释放时,等待队列中的竞争线程被唤醒,从等待链表中移出,竞争线程被重新调度。
使用方法:
1) 声明:
静态声明:
DEFINE_MUTEX(MyMutex)
动态声明:
struct mutex MyMutex;
mutex_init(&MyMutex);
2) 取得和释放:
取得:
void mutex_lock(struct mutex *lock);
int mutex_lock_interruptible(struct mutex *lock);
linux内核带后缀_interruptible,意味着如果收到信号,则函数等待将被打断。
int mutex_lock_killable(struct mutex *lock);
释放:
void mutex_unlock(struct mutex *lock);
3) 检查:
int mutex_is_locked(struct mutex *lock);
如果 mutex 被占用返回1,否则返回 0
互斥锁注意事项
1. 一次只能由一个线程拥有互斥锁
2. 只有锁的拥有者才能释放锁
3. 不能多次解锁
4. 必须使用API初始化
5. 拥有锁的内存区域不能被释放
6. 持有的互斥锁不能重新初始化
7. 因为涉及到重新调度,互斥锁不能用于原子上下文中,如定时器和Tasklet
8. 拥有互斥锁的任务不能被退出,因为互斥锁将保持锁定。可能竞争者会永远等待。
自旋锁:
想要获取自旋锁的线程不断地在循环获取锁,直到获得该锁为止。由于在循环的过程中会消耗大量的CPU,所以当能够快速获取锁时使用它。
原理:
由于自旋,避免重新调度,但会消耗CPU.
使用方法:
1) 声明:
spinlock_t MySpinLock;
spin_lock_init(MySpinLock);
2) 取得和释放:
锁定:
spin_lock(spinlock_t *lock);
spin_lock_irq(spinlock_t *lock);
spin_lock_irqsave(spinlock_t *lock,unsigned long flags);
解锁:
spin_unlock(spinlock_t *lock);
spin_unlock_irq(spinlock_t *lock);
spin_unlock_irqrestore(spinlock_t *lock,unsigned long flags);
比较互斥锁与自旋锁
1. 互斥锁保护线程的关键资源,自旋锁保护IRQ处理程序的关键部分
2. 互斥锁使竞争线程在获得锁之前睡眠,而自旋锁在获得锁之前一直循环
3.互斥锁可长期持有,自旋锁不能长期持有(在一个处理器上自旋意味着在该处理器上不能运行其他任何任务)(消耗CPU)
Linux 内核的锁机制相关推荐
- Linux内核中锁机制之完成量、互斥量
在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等 ...
- linux 信号量锁 内核,Linux内核中锁机制之信号量、读写信号量
在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实际上它是与自旋锁类似的概念,只有得到信号量的进程 ...
- 大话Linux内核中锁机制之原子操作、自旋锁【转】
转自:http://blog.sina.com.cn/s/blog_6d7fa49b01014q7p.html 多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实 ...
- Linux内核抢占实现机制分析【转】
Linux内核抢占实现机制分析 转自:http://blog.chinaunix.net/uid-24227137-id-3050754.html [摘要]本文详解了Linux内核抢占实现机制.首先介 ...
- linux 内核 死锁 检查,一种linux内核自旋锁死锁检测报告系统和方法与流程
本发明涉及内核死锁检测领域,具体的说是一种linux内核自旋锁死锁检测报告系统和方法. 背景技术: linux内核死锁是长期困扰内核开发人员的问题之一,但自内核引入lockdep调试模块之后,内核死锁 ...
- Linux内核自旋锁
Linux内核自旋锁 自旋锁 自旋锁(spinlock)是用在多个CPU系统中的锁机制,当一个CPU正访问自旋锁保护的临界区时,临界区将被锁上,其他需要访问此临界区的CPU只能忙等待,直到前面的CPU ...
- 哪些是Linux内核的同步机制,Linux内核的同步机制(1)
Linux内核的同步机制(1) yanqin | 2009-04-16 14:51:09 阅读:791 发布文章 一. 引言 %A %A 在现代操作系统里,同一时间可能有多个内核执行流在执行,因 ...
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux内核抢占实现机制分析
Linux内核抢占实现机制分析 Sailor_forever sailing_9806@163.com 转载请注明 http://blog.csdn.net/sailor_8318/archive/ ...
- Linux内核自旋锁使用笔记
Reference: spin_lock_bh()与spin_unlock_bh() Linux内核自旋锁 Linux自旋锁 Spinlock - Wikipedia, the free encycl ...
最新文章
- android第一次作业
- Python学习笔记:web开发3
- 按采用的传输介质计算机网络可分为4种,2015年4月全国自考计算机应用基础试卷及答案(00018)...
- treemap 倒序_EXCEL按条件倒序提取,倒数第三次成绩?
- 最新数据显示,全国有580万人被限制乘坐高铁,大家怎么看?
- rabbitmq入门_Rabbit MQ 入门
- USACO2.2【统计,dp,模拟,位运算】
- java事件编程_java基础 ---Swing事件编程
- 计算机辅助功能包括什么,CAD软件是什么?有什么功能?
- 2017年计算机基础知识答题宝典,最全全国计算机基础知识试题及答案考级宝典(2018)..pdf...
- 水滴公司再回应“线下违规”:核心是公司的管理问题
- html标记语言 --超链接
- Linux设备驱动之字符设备(一)
- Android的Crash日志记录
- VC++2010下载教程
- iPhone开发逻辑分辨率
- javaScript原生版购物车:全选、单选、全删、商品数量增减、计算总价、添加商品(代码)
- 数据结构与算法学习---数据结构篇(线性表)(默然回首,夯实基础)
- 在阿里我是如何当面试官的
- java conversion_java 基本数据类型之间的转换(Conversion between Java basic data types).doc...
热门文章
- 距离大决战777天——目前的进度
- matlab怎么对图片实行伽马变换,matlab灰阶变换函数imadjust和stretchlim的c++实现
- Win10怎么样备份和还原开始菜单布局
- 计算机房教师授课记录表,大连工业大学信息技术中心
- 软件测试基础之你的测试覆盖率是多少?
- vivo显示服务器无响应zenns,叮咚!VivoBook14X锐龙版大圣归来提醒你618预售通道开启...
- av_image_get_buffer_size 与 av_image_fill_arrays
- Java数组最大长度
- 用Mathematica和Wolfram语言打造奥斯卡最佳视觉效果
- P1171 售货员的难题