概要:

锁机制是一种保护共享资源不被多次访问的一种机制。共享资源可以是数据(如:全局变量)也可以是设备(如: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 内核的锁机制相关推荐

  1. Linux内核中锁机制之完成量、互斥量

    在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等 ...

  2. linux 信号量锁 内核,Linux内核中锁机制之信号量、读写信号量

    在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实际上它是与自旋锁类似的概念,只有得到信号量的进程 ...

  3. 大话Linux内核中锁机制之原子操作、自旋锁【转】

    转自:http://blog.sina.com.cn/s/blog_6d7fa49b01014q7p.html 多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实 ...

  4. Linux内核抢占实现机制分析【转】

    Linux内核抢占实现机制分析 转自:http://blog.chinaunix.net/uid-24227137-id-3050754.html [摘要]本文详解了Linux内核抢占实现机制.首先介 ...

  5. linux 内核 死锁 检查,一种linux内核自旋锁死锁检测报告系统和方法与流程

    本发明涉及内核死锁检测领域,具体的说是一种linux内核自旋锁死锁检测报告系统和方法. 背景技术: linux内核死锁是长期困扰内核开发人员的问题之一,但自内核引入lockdep调试模块之后,内核死锁 ...

  6. Linux内核自旋锁

    Linux内核自旋锁 自旋锁 自旋锁(spinlock)是用在多个CPU系统中的锁机制,当一个CPU正访问自旋锁保护的临界区时,临界区将被锁上,其他需要访问此临界区的CPU只能忙等待,直到前面的CPU ...

  7. 哪些是Linux内核的同步机制,Linux内核的同步机制(1)

    Linux内核的同步机制(1) yanqin | 2009-04-16 14:51:09    阅读:791 发布文章 一. 引言 %A %A 在现代操作系统里,同一时间可能有多个内核执行流在执行,因 ...

  8. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux内核抢占实现机制分析

    Linux内核抢占实现机制分析 Sailor_forever  sailing_9806@163.com 转载请注明 http://blog.csdn.net/sailor_8318/archive/ ...

  9. Linux内核自旋锁使用笔记

    Reference: spin_lock_bh()与spin_unlock_bh() Linux内核自旋锁 Linux自旋锁 Spinlock - Wikipedia, the free encycl ...

最新文章

  1. android第一次作业
  2. Python学习笔记:web开发3
  3. 按采用的传输介质计算机网络可分为4种,2015年4月全国自考计算机应用基础试卷及答案(00018)...
  4. treemap 倒序_EXCEL按条件倒序提取,倒数第三次成绩?
  5. 最新数据显示,全国有580万人被限制乘坐高铁,大家怎么看?
  6. rabbitmq入门_Rabbit MQ 入门
  7. USACO2.2【统计,dp,模拟,位运算】
  8. java事件编程_java基础 ---Swing事件编程
  9. 计算机辅助功能包括什么,CAD软件是什么?有什么功能?
  10. 2017年计算机基础知识答题宝典,最全全国计算机基础知识试题及答案考级宝典(2018)..pdf...
  11. 水滴公司再回应“线下违规”:核心是公司的管理问题
  12. html标记语言 --超链接
  13. Linux设备驱动之字符设备(一)
  14. Android的Crash日志记录
  15. VC++2010下载教程
  16. iPhone开发逻辑分辨率
  17. javaScript原生版购物车:全选、单选、全删、商品数量增减、计算总价、添加商品(代码)
  18. 数据结构与算法学习---数据结构篇(线性表)(默然回首,夯实基础)
  19. 在阿里我是如何当面试官的
  20. java conversion_java 基本数据类型之间的转换(Conversion between Java basic data types).doc...

热门文章

  1. 距离大决战777天——目前的进度
  2. matlab怎么对图片实行伽马变换,matlab灰阶变换函数imadjust和stretchlim的c++实现
  3. Win10怎么样备份和还原开始菜单布局
  4. 计算机房教师授课记录表,大连工业大学信息技术中心
  5. 软件测试基础之你的测试覆盖率是多少?
  6. vivo显示服务器无响应zenns,叮咚!VivoBook14X锐龙版大圣归来提醒你618预售通道开启...
  7. av_image_get_buffer_size 与 av_image_fill_arrays
  8. Java数组最大长度
  9. 用Mathematica和Wolfram语言打造奥斯卡最佳视觉效果
  10. P1171 售货员的难题