`
ai_longyu
  • 浏览: 479656 次
社区版块
存档分类
最新评论

Linux 设备驱动 ====> 并发控制 --- 自旋锁

 
阅读更多

自旋锁的使用

自旋锁(spin_lock)是一种典型的对临界资源进行互斥访问的手段,顾名思义,为了获得一个自旋锁,在某CPU上运行的代码需要先执行一个原子操作,该操作测试并设置某个内存变量,在该操作完成之前其他执行单元不可能访问到这个内存变量。

如果测试结果表明锁已经空闲,则程序获得这个自旋锁并继续执行;如果测试表明锁仍被占用,程序将在一个小的循环内重复这个“测试并设置”操作,就是“自旋”的动作,就是原地打转。当自旋锁的持有者通过重置该变量释放这个自旋锁后,某个等待的“测试并设置”操作向其调用者报告锁已经释放。

Linux中自旋锁的操作

1. 定义自旋锁

spinlock_t lock;

2 初始化自旋锁

spin_lock_init(lock);

用于动态初始化自旋锁。

3. 获得自旋锁

spin_lock(lock);

该宏用于获得自旋锁lock,如果能够立即获得锁,马上返回,否则,它将自旋在那里直到锁被释放。

spin_trylock(lock);

尝试获得自旋锁lock,如果能后立即获得锁,返回真,否则立即返回假,也就是说不会再“原地打转”。

4. 释放自旋锁

spin_unlock(lock);

释放自旋锁lock,与lock和trylock配套使用。

5. 用法


自旋锁主要用于SMP或者单CPU内核抢占的情况下使用。

驱动工程师应谨慎使用,下面是需要注意的地方:

1. 自旋锁是忙等待,在得不到锁的时候会一直“测试并设置”,这样的话如果长时间得不到锁会浪费系统资源,所以适合用在等待时间比较短的情况下,不然会降低系统的性能。

2. 自旋锁可能会导致系统死锁。当2次试图获得这个自旋锁的时候,CPU会死锁。

3. 自旋锁锁定期间不能调用可能引起进程调度的函数,如果进程获得自旋锁之后再阻塞,如调用copy_from_user()、copy_to_user、kmalloc、msleep等函数,可能会导致内核崩溃。


下面举例说明使用自旋锁实现设备只能被一个进程打开。

我们还是沿用之前的globalmem的例子加以修改


在init函数中初始化


然后我们重新编译并添加模块,然后使用上篇中的测试app来测试,当我们运行测试程序的时候,马上再去打开globalmem的时候会提示设备忙。


自旋锁就简单的介绍到这,结束。

=========================================================

mail & MSN :zhangjie201412@live.com

=========================================================


分享到:
评论

相关推荐

    《精通Linux 设备驱动程序开发》.(Sreekrishnan).pdf

     本书是linux设备驱动程序开发领域的权威著作。全书基于2.6内核,不仅透彻讲解了基本概念和技术,更深入探讨了其他书没有涵盖或浅尝辄止的许多重要主题和关键难点,如pcmcia、i2c和usb等外部总线以及视频、音频、...

    精通LINUX设备驱动程序开发

    22 2.4.3 短延时 24 2.4.4 pentium时间戳计数器 24 2.4.5 实时钟 25 2.5 内核中的并发 26 2.5.1 自旋锁和互斥体 26 2.5.2 原子操作 30 2.5.3 读—写锁 31 2.5.4 调试 32 2.6 proc文件系统 32 2.7 内存分配...

    深入浅出Linux设备驱动之并发控制

    在驱动程序中,当多个线程同时访问相同的资源时(驱动程序中的全局变量是一种典型的共享资源),可能会引发\"竞态\",因此...Linux内核中解决并发控制的最常用方法是自旋锁与信号量(绝大多数时候作为互斥锁使用)。

    Linux设备驱动并发控制介绍

    在驱动程序中,当多个线程同时访问相同的资源时,可能会引发\"竞态\",因此我们必须对共享资源进行并发控制...Linux内核中解决并发控制的最常用方法是自旋锁与信号量。本文详细介绍了自旋锁与信号量的特点和实现方法。

    LINUX设备驱动第三版_588及代码.rar

    LINUX设备驱动第三版_ 前言 第一章 设备驱动程序简介 设备驱动程序的作用 内核功能划分 设备和模块的分类 安全问题 版本编号 许可证条款 加入内核开发社团 本书概要 第二章 构造和运行模块 设置测试系统 ...

    linux设备驱动程序第三版

    1. Linux 设备驱动第三版 .................................................................................................................... 5 2. 第 1 章 设备驱动简介 ....................................

    linux设备驱动程序

    《LINUX设备驱动程序(第3版)》已针对Linux内核的2610版本彻底更新过了。内核的这个版本针对常见任务完成了合理化设计及相应的简化,如即插即用、利用sysfs文件系统和用户空间交互,以及标准总线上的多设备管理等等。...

    linux并发与竞争.pptx

    讲解linux下驱动开发,并发与竞争发生的原理,以及原子操作,自旋锁,信号量,互斥体的使用。ppt纯手工制作,希望对大家有所帮助。

    深入浅出:Linux设备驱动中的并发控制

    并发和竞争发生在两类体系中: ...Linux内核中解决并发控制的方法又中断屏蔽、原子操作、自旋锁、信号量。(后面为主要方式)  中断屏蔽:  使用方法  local_irq_disable() //屏蔽中断  …  

    Android驱动开发权威指南

    第二篇 勿于浮砂筑高台——Linux驱动基础篇 第3章Linux内核综述 3.1 OS基本概念 3.1.1多用户系统 3.1.2用户和组 3.1.3进程 3.1.4 Linux单核架构 3.2 Linux内核综述 3.2.1进程/内核模型综述 3.2.2内存管理综述 3.2.3...

    清华大学Linux操作系统原理与应用

    7.2.2 自旋锁 155 7.2.3 信号量 156 7.3 并发控制实例 157 7.3.1 内核任务及其并发关系 158 7.3.2 实现机制 158 7.3.3 关键代码解释 162 7.3.4 实现步骤 163 习题7 164 第8章 文件系统 165 8.1 Linux文件系统基础 ...

    Linux DeviceDrivers 3rd Edition

    设备文件的访问控制 173 快速参考 179 第七章 时间、延迟及延缓操作 183 度量时间差 183 获取当前时间 188 延迟执行 190 内核定时器 196 tasklet 202 工作队列 204 快速参考 208 第八章 分配内存 213 ...

Global site tag (gtag.js) - Google Analytics