支持异步IO的Linux字符设备驱动程序(4)

《Linux设备驱动开发详解(第2版)》和网上很多资料介绍的aio_*系列编程接口实际上并没有使用设备驱动程序提供的aio接口。glibc提供的这个aio编程接口使用线程和阻塞调用来模拟异步IO,性能很差。要让应用程序真正调用驱动程序提供的aio接口,必须使用libaio库,其源代码可以在下载。libaio提供的接口不同于glibc提供的,介绍其使用的文章似乎不多。为方便libaio的使用,Oracle对其进行了简单的封装,提供了libaio-oracle库,其主页地址是。libaio-oracle封装了libaio库,提供与glibc的aio编程接口非常相似的接口,使用起来较为方便。libaio-oracle不足之处在于,没有实现类似glibc的aio接口那样的、使用信号或者回调函数的异步通知机制,只能使用aio_suspend()挂起调用线程,等待异步IO完成。

笔者使用libaio-oracle编写的异步IO测试程序monitor_fifo主要代码如下:

l 发起AIO读取请求:

支持异步IO的Linux字符设备驱动程序

l 等待AIO完成:

支持异步IO的Linux字符设备驱动程序

使用时,先启动monitor_fifo程序,它会发起一个异步读取请求。因为设备中没有数据可供读取,读取请求会被排队。然后执行echo "abcde" > /dev/fifo 向设备写入一些数据。由于设备中有数据可供读取了,驱动程序处理排队待处理的读取请求,monitor_fifo程序会输出读取操作执行完成的提示信息。这才是真正的异步IO,类似于套接字上的异步读取操作:等待直到有数据到达,读取操作才真正被执行。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyfgxw.html