【计算机网络】IO复用方法(一)——引言
目录
一、引言
二、I/O复用的概念
三、I/O复用的使用情况
四、I/O复用的常见实现方式
select
poll
epoll(Linux特有)
五、I/O复用的典型应用场景
六、选择I/O复用技术的考量因素
一、引言
当TCP的服务端正常情况下,如果只存在一个线程,但需要两个客户端同时连接。但是当第一个客户端与服务端建立连接之后,产生一个c1,此时需要接收第一个客户端的数据会出现一个recieve,而c1在等待传输数据,如果第一个客户端不发数据,此时c1被阻塞住。那么此时该线程停止了没办法去处理第二个客户端,因此想要解决两个以上的客户端可以同时被服务器端处理,我们可以引入多线程方法。但是当客户端数量巨大时,多线程需要来回切换就不太适用。
因此引入I/O复用方法。
二、I/O复用的概念
I/O复用使得程序能同时监控多个文件描述符(如套接字、管道等),当其中任何一个文件描述符就绪(可读、可写或异常)时,程序可以立即处理。核心目标是避免多线程或多进程的开销,同时高效管理大量并发连接。
简单来说,I/O复用技术的作用是帮助服务器去检测哪个客户端有数据就去处理哪个客户端,而不是只按顺序去处理客户端,如果哪个客户端没有数据,将会一直阻塞,直至有数据传输。
三、I/O复用的使用情况
- 客户端程序要同时处理多个socket。比如非阻塞conncct 技术;
- 客户端程序要同时处理用户输入和网络连接。比如聊天室程序;
- TCP服务器要同时处理监听socket和连接socket。这是I/0复用使用最多的场合;
- 服务器要同时处理TCP请求和UDP请求。比如回射服务器;
- 服务器要同时监听多个端口,或者处理多种服务。比如xinetd 服务器。
总结:程序需要多个文件描述符适用。虽然可以同时监听多个文件描述符,但其本身是阻塞的。且当多个文件描述符同时就绪时,如果不能采取额外措施,程序只能按顺序依次处理文件描述符。
四、I/O复用的常见实现方式
select
用途:在一段指定时间里,监听用户感兴趣的文件描述符上的可读、可写和异常等事件。
- 跨平台支持,但性能较差,存在文件描述符数量限制(通常为1024)。
- 通过位图管理描述符,每次调用需重新传递全部描述符。
- 时间复杂度为O(n),需遍历所有描述符检查就绪状态。
poll
用途:poll 系统调用和select类似,也是在指定时间内轮询一定数量的文件描述符,以测试中是否有就绪者
- 改进select的描述符数量限制,使用动态数组而非位图。
- 仍需要遍历所有描述符,时间复杂度为O(n)。
- 无跨平台问题,但性能与select相近。
epoll(Linux特有)
用途:epoll是Linux特有的。它在实现和使用上与select、poll有很大差异。首先,epoll使用一组函数来完成任务,而不是单个函数。其次,cpoll把用户关心的文件描述符上的事件放在内核里的一个事件表中,从而无须像select和poll那样每次调用都要重复传人文件描述符集或事,但epoll需要使用一个额外的文件描述符,来唯一标识内核中的这个事件表。
- 基于事件驱动,仅返回就绪的描述符,时间复杂度O(1)。
- 支持水平触发(LT)和边缘触发(ET)模式。
- 适用于高并发场景,如Web服务器。
五、I/O复用的典型应用场景
- 网络服务器:如Nginx、Redis,处理成千上万的并发连接。
- 实时通信:聊天服务器或游戏后端,需低延迟响应多个客户端。
- 文件处理:监控多个日志文件的实时变化(如
tail -f)。
六、选择I/O复用技术的考量因素
- 平台兼容性:优先考虑epoll(Linux)、kqueue(BSD)或IOCP(Windows)。
- 性能需求:高并发场景下,epoll/kqueue优于select/poll。
- 开发复杂度:select/poll接口简单,但需手动优化;epoll需理解事件模型。
通过合理选择I/O复用技术,可以显著提升程序的并发能力和资源利用率。
