概述
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)每次返回时,只返回就绪链表中的数据
最后
以上就是调皮铃铛为你收集整理的IO多路复用:select,poll,epoll的区别的全部内容,希望文章能够帮你解决IO多路复用:select,poll,epoll的区别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复