Linux设备驱动开发-10阻塞与休眠
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
-高级字符驱动程序操作
[阻塞型I/O和休眠]
阻塞操作室指在执行设备操作的时候若不能获得资源将挂起进程,直到满足课操作的条件后再进行操作。被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。
因为阻塞的进程会进入休眠状态,因此,必须确保有一个地方能够唤醒休眠的进程,唤醒进程的地方最大可能发生在中断里面,因为硬件资源的获得的同时往往伴随着一个中断。
在linux驱动程序中,可以使用等待队列来实现阻塞进程的唤醒
2.6提供如下等待队列的操作:
1、定义等待队列头
Wait_queue_head_t my_queue;
2、初始化等待队列头
Init_waitqueue_head(&my_queue)
下面的宏可以作为定义并初始化等待队列头的快捷方式
DECLARE_WAIT_QUEUE_HEAD(name)
3、定义等待队列
DECLARE_WAITQUEUE(name,task)
用于定义并初始化一个名为name的等待队列
4、添加/移除等待队列
Void fastcall add_write_queue(wait_queue_head_t *q,wait_queue_t *wait) Void fastcall remove_wait_queue(wait_queue_head_t *q,wait_queue_t *wait) add_write_queue用于将等待队列wait添加到等待队列头q指向的等待队列链表中,
remove_wait_queue用于将等待队列wait从附属的等待队列头q指向的等待队列链表中移除。
5、等待事件
Wait_event(queue,condition)
Wait_event_interruptible(queue,condition)
Wait_event_timeout(queue,condition,timeout)
Wait_event_interruptible_timeout(queue,condition,timeout)
等待第一个参数queue作为等待队列头的等待队列被唤醒,而且第二个参数condition必须满足,否则阻塞。
6、唤醒队列
Void wake_up(wait_queue_head_t *queue)
Void wake_up_interruptible(wait_queue_head_t *queue)
上述操作会唤醒以queue作为等待队列头的所有等待队列中所有属于该等待队列头的等待队列对应的进程。
详解函数
在Linux 中,一个等待队列由一个wait_queue_head_t 结构体来管理,其定义在
它包含一个自旋锁和一个链表。这个链表是一个等待队列入口,它被声明做
wait_queue_t。wait_queue_head_t包含关于睡眠进程的信息和它想怎样被唤醒。
Linux 内核中最简单的休眠方式是称为wait_event的宏(及其变种),它实现了休眠和进程等待的条件的检查。形式如下:
唤醒休眠进程的函数称为wake_up,形式如下:
惯例:用wake_up 唤醒wait_event ;用wake_up_interruptible 唤醒wait_event_interruptible。