IO多路复用:select,poll,epoll的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010841296/article/details/77528832

I/O多路复用:
(1)单个线程,通过记录跟踪每个I/O流(sock)的状态,来同时管理多个I/O流)
(2)I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的。

应用场景:
(1)服务器需要同时处理多个处于监听状态或者多个连接状态的套接字;
(2)服务器需要同时处理多种网络协议的套接字

举3个实现机制的例子:
1.select:
(1)如果任何一个sock(I/O stream)出现了数据,select 仅仅会返回,但是并不会告诉你是哪个sock上有数据,于是你只能自己一个一个的找。
(2)只能监视1024个链接,linux 定义在头文件中的,参见FD_SETSIZE。
(3)非线程安全。
(4)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大
(5)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大

这里写图片描述

2.poll
(1)去除了1024个链接的限制
(2)非线程安全。

3.epoll
这里分享一个很不错的epoll的文章

epoll在java中有以下几点
(1)线程安全
(2)返回数据时,告诉你哪个sock有数据
(3)仅用于linux2.6以上内核
(4)nginx的事件处理就是使用epoll机制的
(5)去除了1024个链接的限制
(6)每次返回时,只返回就绪链表中的数据

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u010841296/article/details/77528832