我是靠谱客的博主 调皮铃铛,最近开发中收集的这篇文章主要介绍IO多路复用:select,poll,epoll的区别,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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的区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部