设为首页 加入收藏

TOP

Linux设备驱动之阻塞I/O与异步通知
2016-12-12 08:15:29 】 浏览:7486
Tags:Linux 设备驱动 阻塞 I/O 异步 通知

阻塞与非阻塞访问是 I/O 操作的两种不同模式,前者在 I/O 操作暂时不可进行时会让进程睡眠,后者则不然。在设备驱动中阻塞 I/O一般基于等待队列来实现,等待队列可用于同步驱动中事件发生的先后顺序。使用非阻塞 I/O 的应用程序也可借助轮询函数来查询设备是否能立即被访问,用户空间调用 select()和 poll()接口,设备驱动提供 poll()函数。设备驱动的 poll()本身不会阻塞,但是 poll()和 select()系统调用则会阻塞地等待文件描述符集合中的至少一个可访问或超时。
在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问。这样,使用无阻塞 I/O 的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似“中断”的异步通知所取代。


进程阻塞会进入睡眠,进入睡眠时应确保有其他进程或者中断将其唤醒,而用于唤醒的进程必须知道正在睡眠的进程在哪儿,于是就有了等待队列——睡眠进程的队列,都等待一个特定的唤醒信号。


使用非阻塞 I/O的应用程序通常会使用 select()和 poll()系统调用查询是否可对设备进行无阻塞的访问。 select()和poll()系统调用最终会引发设备驱动中的 poll()函数被执行。
设备驱动中 poll()函数的原型是:


关键的用于向 poll_table 注册等待队列的 poll_wait()函数的原型如下:


异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”的概念,比较准确的称谓是“信号驱动的异步 I/O”。
阻塞 I/O 意味着一直等待设备可访问后再访问,非阻塞 I/O 中使用 poll()意味着查询设备是否可访问,而异步通知则意味着设备通知自身可访问,实现了异步 I/O。
为了使设备支持异步通知机制,驱动程序中涉及 3 项工作:


驱动中的上述 3 项工作和应用程序中的 3 项工作是一一对应的,如图所示为异步通知处理过程中用户空间和设备驱动的交互:
异步通知处理过程中用户空间和设备驱动的交互


设备驱动中异步通知编程比较简单,主要用到一项数据结构和两个函数。数据结构是fasync_struct 结构体, 两个函数分别是:


使用方法:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇使用Python crontab设置Linux定时.. 下一篇用HashSet的add方法谈hashcode和e..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目