1. 驱动中阻塞和非阻塞,异步通知
----------
| | --------
| 进程 | <-------------->| 设备 |
| | --------
----------
阻塞: 进程等待设备资源可用, 等待过程中, 进程休眠(CPU切换去执行别的进程)。
非阻塞: 不等待,轮询设备
异步通知: 让设备主动去通知进程。
注: 提出阻塞,非阻塞,异步通知概念,这里是为了解决资源未准备好时, 进程和设备间是如何打交道的
1.1 阻塞方式
- 如何在驱动中实现阻塞I/O?
当有多个进程阻塞睡眠时,可用排队的方式,当造成阻塞的条件消失(如有资源释放了),去唤醒阻塞在排队的进程. - 什么叫等待队列?
以队列为基础数据结构,与进程调度机制紧密结合,能够用于实现内核中的异步事件通知机制,同步对系统资源的访问。
如:
当某进程不满足某条件时(如资源), 可把进程暂时睡眠,放入队列中,
等条件满足时(如某资源被释放出来了),再把进程唤醒去执行-
如何使用等待队列在驱动中实现阻塞?
#include <linux/sched.h> static wait_queue_head_t queue; //定义等待队列 static int condition=0; //定义等待条件 wait_event_interruptible(queue, condition!=0); //在等待队列上检测是否需等待 wake_up_interruptible(&queue); //唤醒在queue等待队列上等待的所有进程
-
1.2 非阻塞方式
1.2.1 函数调用关系
应用:
用select/poll // I/O多路复用
驱动:
实现.poll 函数。
----------------------------
| 应用 |
| select/poll |
---------------------------
|
---------------------------
|内核 sys_poll | //poll系统调用,轮询poll_table中的驱动.poll, 当设备可读或可写则返回
| | |
|