IO多路复用

IO多路复用就是通过一种机制,同时监视多个文件描述符,一旦某个文件描述符就绪(比如读就绪或写就绪),会通知应用程序进行相应的处理。
select、poll、epoll本质上都是同步IO,它们都需要在事件就绪后,由应用程序自己进行读写。而异步IO不需要应用程序自己进行读写,异步IO实现负责把数据从内核拷贝到用户空间。

Linux提供了select、poll、epoll,来实现IO多路复用机制,下面会分别对它们进行简要的说明。


select、poll

关于select、poll的原型和详细说明,请点击这个链接
在这里,只对select和poll的执行过程,进行简要的说明:


epoll

关于epoll的详解,请点击这个链接

epoll的使用过程如下:

与select、poll相比,epoll有下面的特点:


水平触发和边缘触发

epoll有水平触发和边缘触发两种模式。水平触发是默认模式,边缘触发是高速模式。在水平触发模式下,如果一个描述符有数据可读,那么每次调用epoll_wait都会返回该描述符的事件。而在边缘触发模式下,只会提醒一次,直到有新的数据流入。因此在边缘触发模式下,读一个描述符一定要读空它的buffer,也就是一直读到read的返回值小于它的请求值,或遇到EAGAIN错误(读非阻塞socket的时候,如果输入缓冲区中没有数据,就会出现EAGAIN错误,意思是告诉应用程序,再读一次或许就有数据了)。


文件描述符

当进程打开或新建一个文件的时候,内核会返回一个文件描述符,文件描述符是一个非负整数,取值范围是0到max open files。
内核会为每个进程维护一个 保存该进程打开的文件的 记录表,文件描述符就是这个记录表中的索引值,内核利用文件描述符来访问文件。
通常,标准输入的文件描述符是0,标准输出的文件描述符是1,标准错误输出的文件描述符是2。


epoll in Python

Python标准库的select模块,提供了访问 操作系统的IO多路复用接口的 功能。select的文档在:https://docs.python.org/2.7/library/select.html
下面主要介绍其中关于epoll的部分:


参考文档