Linux native AIO与eventfd、epoll的结合使用
2013-03-01 14:55
253 查看
Linux native AIO与eventfd、epoll的结合使用
2013年1月9日lenky发表评论阅读评论526
次浏览
在前面的示例libaio_test.c和native_aio_test.c中,可以看到对磁盘aio请求(本文的aio都指此类)的使用有阻塞等待,这明显之处为对io_getevents()函数(当然,其它函数,比如io_submit()也有一定程度的阻塞)的调用,它会等待并获取已完成的io请求,如果当前没有或少于指定数目的io请求完成,那么就会等待直到timeout。
io_getevents()函数的等待会导致整个进程的阻塞使得程序无法继续向下执行,如果程序还有其它阻塞点,那么有必要想办法把这多处等待合而为一同时进行,从而提高并行性,也就是通常所说的select/epoll等这类多路复用技术。
本文就以epoll为例,介绍一下在linux下,如何把aio结合并应用到epoll机制里。我们知道,epoll机制的最大好处就是它能够在同一时刻对多个文件描述符(通常是由众多套接字形成的描述符集合)进行监听,并将其上发生的读/写(或错误等)事件通知给应用程序,也就是做到时间上的复用。如果能够把aio也放到epoll机制里,即把aio当作epoll机制里的“一路io”,那么就能使得aio与其它可能的等待操作(比如:读/写套接字)共同工作,从而达到时间复用的目的。
作为epoll机制里的“一路io”,需要一个文件描述符来反馈对应的发生事件,而对于纯aio而言,是没有文件描述符作为代表的,因此linux系统上多出了一个eventfd()的系统调用:
充当中间桥梁的eventfd有了,并且eventfd()函数返回的描述符可以添加到epoll机制内,因此剩下需要做的就是把eventfd与aio联系起来,而目前aio当然已经有了这个支持,不过,由于native aio的相关结构体有两套封装,即一种是libaio的封装,一种是内核的直接封装(便于直接使用aio),比如iocb:
libaio的封装(来之:/usr/include/libaio.h):
废话少说,看两个示例,第一个来之:http://blog.sina.com.cn/s/blog_6b19f21d0100znza.html
或 http://lenky.info/?p=2183
相关文章推荐
- Linux native AIO与eventfd、epoll的结合使用
- Linux native AIO与eventfd、epoll的结合使用
- linux 下epoll与线程池结合使用的简单实例
- linux 下epoll与线程池结合使用的简单实例
- linux 下epoll与线程池结合使用的简单实例(含常用函数解释)
- Linux命令 find和mv的结合使用:查找文件,移动到某个目录
- [转] linux新的API signalfd、timerfd、eventfd使用说明
- Linux epoll使用详解
- Python——在Python中如何使用Linux的epoll
- 一个epoll/aio/eventfd结合使用的简单例子_sunfly_新浪博客
- linux中新增系统调用signalfd、timerfd、eventfd使用说明
- Linux系统编程——I/O多路复用select、poll、epoll的区别使用
- Linux 新的API signalfd、timerfd、eventfd使用说明
- Linux-视频监控系统(2)-Epoll的介绍及使用
- Linux非阻塞IO(七)使用epoll重新实现客户端
- linux下ACE使用epoll
- 在Linux中使用grep和egrep结合正则表达式查找字符
- Linux下服务器端使用EPOLL ACCEPT产生的问题
- linux新的API signalfd、timerfd、eventfd使用说明——eventfd
- Linux 下使用epoll实现转发服务器的小DEMO