优点:通过单线程处理多个客户端同时接入请求,不需要创建额外的进程和线程,减少了维护额外进程和线程运行,系统开销小,减少维护工作量,节省了系统资源。
应用场景:
1、同时处理多个连接和监听状态的套接字
2、同时处理多种网络协议的套接字
原理:
把多个I/O的阻塞复用到同一个模型(select、pselect、poll、epoll)的阻塞上,使在单线程的情况下同时处理多个客户端请求
IO复用模式
select:时间复杂度O(n),通过轮询所有读写流,对它们进行操作,流越多,轮询的时间越长,单个进程打开FD数量有限制,由FD_SETSIZE设置,默认是1024
poll:时间复杂度O(n),poll本质select没有区别,将传入的流拷贝到内核空间,然后查询每 个fd对应的设备状态, 没有连接数的限制,它是基于链表来存储的.
epoll:时间复杂度O(1), epoll会流发生的I/O事件进行通知,epoll实际上是事件驱动(事件关联上fd)的。打开FD数量没有限制,上线是操作系统的最大文件句柄数
查看句柄数命令:4G内存
[root@VM-8-2-centos /]# cat /proc/sys/fs/file-max
368216
select,poll,epoll本质上都是同步I/O,读写事件就绪后进行读写,这个读写过程是阻塞的.