在I/O编程过程中,当需要同时处理多个客户端接入请求时,可以利用多线程或者I/O多路复用技术进行处理。I/O 多路复用技术通过把多个I/O的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的多线程/多进 程模型比,I/O多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程,也不需要维护这些进程和线程的运行,降底了系统的维护工作量,节 省了系统资源,I/O多路复用的主要应用场景如下:
-
服务器需要同时处理多个处于监听状态或者多个连接状态的套接字。
-
服务器需要同时处理多种网络协议的套接字。
目前支持I/O多路复用的系统调用有 select,pselect,poll,epoll,在Linux网络编程过程中,很长一段时间都使用select做轮询和网络事件通知,然而select的一些固有缺陷导致了它的应用受到了很大的限制,最终Linux不得不在新的内核版本中寻找select的替代方案,最终选择了epoll。epoll与select的原理比较类似,为了克服select的缺点,epoll作了很多重大改进,现总结如下:
1. 支持一个进程打开的socket描述符(FD)不受限制(仅受限于操作系统的最大文件句柄数)。
select最大的缺陷就是单个进程所打开的FD是有一定限制的,它由FD_SETSIZE设置,默认值是1024。 对于那些需要支持上万个TCP连接的大型服务器来说显然太少了。可以选择修改这个宏,然后重新编译内核,不过这会带来网络效率的下降。我们也可以通过选择 多进程的方案(传统的Apache方案)解决这个问题,不过虽然在Linux上创建进程的代价比较小,但仍旧是不可忽视的,另外,进程间的数据交换非常麻 烦,对于Java由于没有共享内存,需要通过Socket通信或者其他方式进行数据同步,这带来了额外的性能损耗,增加了程序复杂度,所以也不是一种完美 的解决方案。值得庆幸的是,epoll并没有这个限制,它所支持的FD上限是操作系统的最大文件句柄数,这个数字远远大于1024。例如,在1GB内存的机器上大约是10万个句柄左右,具体的值可以通过cat/proc/sys/fs/filemax察看,通常情况下这个值跟系统的内存关系比较大。
2. I/O效率不会随着FD数目的增加而线性下降。
传统的select/poll另一个致命弱点就是当你拥有一个很大的 socket集合,由于网络延时或者链路空闲,任一时刻只有少部分的socket是“活跃”的,但是select/poll每次调用都会线性扫描全部集 合,导致效率呈现线性下降。epoll不存在这个问题,它只会对“活跃”的socket进行操作-这是因为在内核实现中epoll是根据每个fd上面的 callback函数实现的,那么,只有“活跃”的socket才会主动的去调用callback函数,其他idle状态socket则不会。 在这点上,epoll实现了一个伪AIO。针对epoll和select性能对比的benchmark测试表明:如果所有的socket都处于活跃态。例 如一个高速LAN环境,epoll并不比select/poll效率高太多;相反,如果过多使用epoll_ctl,效率相比还有稍微的下降。但是一旦使 用idle connections模拟WAN环境,epoll的效率就远在select/poll之上了。
3. 使用mmap加速内核与用户空间的消息传递
无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存复制就显得非常重要,epoll是通过内核和用户空间mmap使用同一块内存实现。
4. epoll的API更加简单
用来克服select/poll缺点的方法不只有epoll,epoll只是一种Linux的实现方案。在freeBSD下有kqueue,而dev/poll是最古老的Solaris的方案,使用难度依次递增。但epoll更加简单。
相关推荐
1、基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合: ...与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创
Libevent支持多种I/O多路复用技术的关键在于结构体eventop,它的成员是一系列的函数指针, 定义在event-internal.h文件中: struct eventop { const char *name; void *(*init)(struct ...
本示例演示了使用poll函数处理多路IO复用。本示例在ubuntu + Qt下编译通过的,仅提供学习使用。
主要介绍了Linux I/O多路复用详解及实例的相关资料,并附实例代码,需要的朋友可以参考下
基于TCP的传输 简单的I/O复用的实现,
单片机实验一,I/O端口实验报告(2).pdf单片机实验一,I/O端口实验报告(2).pdf单片机实验一,I/O端口实验报告(2).pdf单片机实验一,I/O端口实验报告(2).pdf单片机实验一,I/O端口实验报告(2).pdf单片机实验一,I/O...
windows下多路复用IO(select,WSAAsyncSelect,WSAEventSelect)
SHENZHEN I/O 游戏官方手册。 游戏内有这本手册,但如果你还没拥有这款游戏但又想先看一下这本神秘的手册上有什么,可以下载来看看。 关于游戏本身我就不介绍了,在Steam平台可以入手。
IO 多路复用是一种高效的输入/输出(I/O)管理机制,允许单个进程同时监控多个文件描述符(FD),以便在其中某个文件描述符上发生事件时,立即响应。IO 多路复用机制广泛应用于服务器端编程、网络编程等领域,能够...
NULL 博文链接:https://xace.iteye.com/blog/706935
CSCJ_IO模拟量I/O 单元操作手册zip,CSCJ_IO模拟量I/O 单元操作手册
网络io与io多路复用select/poll/epoll 服务器并发代码实现
应用Intel VT for Directed I/O技术实现高性能虚拟I/O模型,张鑫,吕明,本文基于XEN开源虚拟机,在当前世界流行的虚拟I/O模型基础上,引入了Intel VT-d技术,基于它实现了一种高性能虚拟I/O模型,并对其实现��
服务端采用I/O复用模型(select函数)接收客户端的时间同步请求 服务端采用单线程,但要能同时接收多客户端的连接请 求,显示客户端IP和端口,并向其回送时间信息...注:借助 I/O 复用模型,用单线程达到多线程的效果。
Chapter 4 - The Parallel Effective I/O Bandwidth Benchmark—b_eff_io Chapter 5 - Parallel Join Algorithms on Clusters Chapter 6 - Server-side Scheduling in Cluster Parallel I/O Systems Chapter ...
罗克韦尔Point I/O选型指南zip,POINT I/O 系列具有适合于灵活及低成本应用场合的模块化 I/O,是成功实现控制系统设计和操作的关键。作为罗克韦尔自动化集成架构的主要成员,其完善的诊断功能和可组态特性使产品可...
使用epoll实现io复用,多个服务器同时与多个客户端连接。
实验 单片机I/O 口控制实验 一. 实验目的 利用单片机的P1 口作IO 口,使用户学会利用P1 口作为输入和输出口。 二. 实验设备及器件 IBM PC 机 一台
三种IO多路复用机制: 一:select 二:poll 三:epoll 以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.csdn.net/user/qiulanzhu
自己写的TCPecho服务器,利用IO多路复用技术,注意是linux源码,非windows