i/o复用函数select,poll,epoll的区别

三组i/o复用函数的区别:
select、poll、epoll本质都是同步I/O,他们都需要在读写事件就绪之后自己负责读写,即这个读写过程是阻塞的。


1.select的类型参数fd_set没有将文件描述符和事件绑定,这使得select不能处理更多的事件,并且由于内核对fd_set集合的在线更改,下次使用select必须得重置这三个fd_set集合。

2.poll的参数类型pollfd则是将文件描述符和事件都定义其中,任何事情都统一处理,使得编程接口简洁许多。并且内核每次只修改revents成员,而events不变,因此下次调用poll,不需要重置pollfd类型的事件集合。


3.epoll是用一组函数来完成任务,而不是单个函数。epoll_create是创建一个epoll句 柄,句柄都会把所有的fd拷贝进来,在内核中维护一个事件表而不是在epoll_wait中重复拷贝,这样确保fd只会被拷贝一次。并提供一个独立的系统调用epoll_ctl来控制往事件表中添加,删除,修改事件。epoll_wait系统调用的events参数仅仅返回就绪的事件。

4.由于poll和select每次调用时,都要将整个用户注册的事件集合传给内核,所以应用程序索引就绪事件的时间复杂度为O(n),而epoll每次只需要在内核时间表中读取事件,无需反复从用户空间读入这些事件,则索引就绪事件的时间复杂度为O(1)。


5.select允许监听的最大文件描述符数量通常是有限的,默认值是1024,。但是poll和epoll监听的的文件描述符的数量都能达到最大允许打开的数量,即65535.

6.poll和select都是采用轮询的方式来扫描整个注册文件描述符集合,将就绪的事件返还给用户空间,因此检测就绪事件时间复杂度为O(n)。epoll采用回调方式来检测就绪事件,算法事件复杂度为O(1)。


猜你喜欢

转载自blog.csdn.net/qq_40340448/article/details/80006517