Linux五种IO模型
Java的三种IO模型
阻塞IO,BIO
非阻塞IO,NIO
异步IO,AIO
阻塞IO模型:调用recvfrom函数进行数据拷贝;
非阻塞IO模型:不用阻塞,但要时不时主动调用一下recvfrom;
信号驱动IO模型:不用时不时主动调用,而是有信号主动通知你,当接收到信号之后,再调用recvfrom。信号驱动是异步的,但数据拷贝仍是同步的;
IO多路复用模型:多个IO注册到同一个select上,select会监听所有注册好的IO。调用select函数会阻塞,直到至少有一个IO准备好了就返回,返回后再调用recvfrom函数进行数据拷贝;由于调用select会有阻塞,因此这种方式是阻塞的;
异步IO:只有异步IO是异步的,其它四种都是同步的,异步指的是数据拷贝的过程是异步的;用户进程调用aio_read后,剩下的准备数据、数据拷贝工作都交给内核去做,等数据拷贝完成后,再通知用户进程;
select、poll、epoll都属于IO多路复用。
I/O多路复用通过一种机制,可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的。而异步I/O则无需自己负责进行读写。
epoll跟select都能提供多路I/O复用的解决方案。在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则是POSIX所规定,一般操作系统均有实现。
在选择select,poll,epoll时要根据具体的使用场景及它们自身特点:
表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll轮询机制的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调;





