【Linux-驱动】驱动策略----信号量
访问共享资源的代码区块叫“临界区”,临界区需要以某种互斥机制加以保护:自旋锁、信号量等。
互斥访问:一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问。
信号量:在Liunx中的信号量是一种睡眠锁。假如进程A先持有信号量F,然后进程B试图获取已经被进程A持有的信号量F时(假如信号量F资源值为1),信号量会将B进程推入等待队列,然后让
其睡眠。当持有信号量的进程A将信号量F释放后,进程B才会被唤醒,从而获得这个信号量,继续执行进程B代码。
PS:信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;信号量只能在进程中使用,不能再中断中使用。
信号量基本使用形式:
(1) 定义信号量:struct semaphore sem;
(2) 初始化信号量:void sema_init(struct semaphore *sem, int val);
(3) 初始化互斥信号量:
void init_MUTEX(struct semaphore *sem);
等同于:sema_int(struct semaphore*sem, 1);
获得信号量:
(1) void down(struct semaphore *sem);
此函数用于获得信号量sem,它会导致睡眠,因此不能用于中断上下文
(2) int down_interruptible(struct semaphore *sem);
同down(),差异在于因为down()而进入睡眠状态的进程不能被信号打断,而因为down_interruptible()而进入睡眠状态的进程能被信号打断,而信号会导致该函数返回,这时候函数返回非0;
(3) int down_trylock(struct semaphore *sem);
该函数尝试获得信号量sem,如果能够立即获得,它就获得该信号量返回0,否则,返回非0值,它不能导致调用者睡眠,可以在中断上下文使用。
释放信号量:
void up(struct semaphore *sem);
该函数释放信号量sem,唤醒等待者。
使用信号量的注意事项:
(1)可以长期加锁;
(2)只能用于进程上下文,不能用于中断上下文;
(3)在持有自旋锁的同时,不能持有信号量;
【Linux-驱动】驱动策略----信号量的更多相关文章
- linux设备驱动概述,王明学learn
linux设备驱动学习-1 本章节主要学习有操作系统的设备驱动和无操作系统设备驱动的区别,以及对操作系统和设备驱动关系的认识. 一.设备驱动的作用 对设备驱动最通俗的解释就是“驱使硬件设备行动” .设 ...
- linux设备驱动归纳总结(十二):简单的数码相框【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-116926.html linux设备驱动归纳总结(十二):简单的数码相框 xxxxxxxxxxxxxx ...
- linux设备驱动归纳总结(五):4.写个简单的LED驱动【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-84693.html linux设备驱动归纳总结(五):4.写个简单的LED驱动 xxxxxxxxxxx ...
- linux设备驱动归纳总结(四):5.多处理器下的竞态和并发【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-67673.html linux设备驱动归纳总结(四):5.多处理器下的竞态和并发 xxxxxxxxxx ...
- linux设备驱动归纳总结(四):3.抢占和上下文切换【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-65711.html linux设备驱动归纳总结(四):3.抢占和上下文切换 xxxxxxxxxxxxx ...
- linux设备驱动归纳总结(四):2.进程调度的相关概念【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-65555.html linux设备驱动归纳总结(四):2.进程调度的相关概念 xxxxxxxxxxxx ...
- Linux设备驱动之semaphore机制【转】
转自:http://blog.csdn.net/xiao229404041/article/details/7031776 Linux设备驱动之semaphore机制在Linux系统中,信号号是一种重 ...
- linux设备驱动第五篇:驱动中的并发与竟态
综述 在上一篇介绍了linux驱动的调试方法,这一篇介绍一下在驱动编程中会遇到的并发和竟态以及如何处理并发和竞争. 首先什么是并发与竟态呢?并发(concurrency)指的是多个执行单元同时.并行被 ...
- 《Linux设备驱动开发详解(第2版)》配套视频登录51cto教育频道
http://edu.51cto.com/course/course_id-379-page-1.html http://edu.51cto.com/course/course_id-379-page ...
- Linux设备驱动中的阻塞和非阻塞I/O
[基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到 ...
随机推荐
- Linux系统中的硬件问题如何排查?(1)
在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工作,即使是经验相当丰富的用户有时也会遇上自己搞不定的状况,本文分享一些实用的技巧与处理方法,希望有助于读者朋友理解.查明并最终搞 ...
- qt5-工程文件的介绍--快捷键
Ctrl+/ 注释
- Django对中间件的调用思想、csrf中间件详细介绍、Django settings源码剖析、Django的Auth模块
目录 使用Django对中间件的调用思想完成自己的功能 功能要求 importlib模块介绍 功能的实现 csrf中间件详细介绍 跨站请求伪造 Django csrf中间件 form表单 ajax c ...
- 34 String、StringBuffer、StringBuilder
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. StringBuffer是可变类,和线程安全的字符串操作类,任何对 ...
- 【shell】grep使用正则表达式
要求如下: 有一些具有固定格式的数字, 如下: -- ()-- -- (-- 复制代码 条件: .> 长度为7的数字 .> 由 ,, 长度组成, 并由 - 字符进行分割的 .> 第一 ...
- Maven手动命令行导入ojdbc6
Maven项目中导入Oracle的驱动包时,可能会出现像我一样下载资源不成功的情况,如下图所示: 出现这种情况的原因其实是因为Oracle的授权问题,这样的话,我们在需要使用Oracle的驱动包时, ...
- QT 信号槽 异步事件驱动 单线程 多并发
利用好Qt 模块的异步信号槽,单线程同样可是实现很强悍的的并发能力.应付正常的功能是足够的. 需要注意的是:该模式本质上为 单线程 事件驱动异步模式,所以需要做的事优化你的业务代码构架以应付性能与并发 ...
- iOS 消息转发以及 NSProxy 实战
最后更新: 2018-01-17 一.消息派发机制-NSObject 在 iOS 开发中, 调用对象的方法就是给对象发送一个消息.了解消息的派发机制对于iOS开发来说是一个很实用且强大的工具, 下面我 ...
- [CSP-S模拟测试]:山屋惊魂(模拟)
题目传送门(内部题90) 输入格式 前四行依次表示每种属性:$Might$.$Speed$.$Sanity$.$Knowledge$.每行一个$8$位数表示该属性的$8$个档的值,第二个数表示初始在哪 ...
- pymysql 处理数据的几种方式
1.表中提取数据 sql = "SELECT * FROM table WHERE name='%s'AND time='%s'" % (name,time)多个选择条件用AND连 ...