I\O多路复用

I\O多路复用实际上就是使用select,poll,epoll监听多个I\O对象,当IO对象有变化(有数据)的时候,就通知用户进程,这样就不会因为阻塞在其中一个而不能处理另外一个IO对象的消息。

select与eopll的区别

select和elpoo的区别主要体现在I\O模型、文件描述符数量限制、事件触发方式、内核实现机制等方面。

I\O模型:

select采用轮询模型,每次都需要遍历所有的文件描述符集合,而epoll是基于时间驱动的模型,通过回调函数

处理活跃的文件描述符,效率更高。

文件描述符数量限制:

select的限制在1024字节左右,而epoll没有这个限制,适用于高并发场景。

事件触发方式:

epoll支持两种触发方式,ET(边缘触发)LT(水平触发)

select只支持LT(水平触发)即描述符由不可读或者不可写变为可读或可写时,select才通知有事件发生。

内核实现机制:

select是系统调用,每次调用都需要把全部的文件描述符集合从用户态传输到内核态,并且需要判断每个描述符是否就绪。

epoll是内核和用户空间共性的一块内存,只需要在内核空间注册一个时间表,然后等待通知,不需要对已注册的文件描述符进行遍历。

并发限制:

select有最大并发数限制,默认最大句柄数为1024,可修改。

epoll没有最大文件句柄数限制,仅受系统中进程能打开的最大文件句柄限制。

使用方便性:

epoll接口使用方便,采用事件结构方式监控,简化了对多个监控结合的操作。

select接口使用不方便,每次调用完select都需要重新设置fd_set,因为输入输出未分离,返回的fd_set会将未就绪的fd清空。