select、poll和epoll之间的区别
在深入理解select、poll和epoll之间的区别之前,首先要了解什么是IO多路复用模型。 IO多路复用 简单来说,IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备就绪,它就通知该进程去进行IO操作。 详细的描述可以参考 IO模型 。select、poll和epoll都是提供I/O多路复用的解决方案。 select 函数 int select(int maxfdp, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout); 基本原理 :select 函数监视的文件描述符分3类,分别是 writefds 、 readfds 、和 exceptfds 。调用select时会被阻塞,直到有fd就绪(读、写、或者异常),或者超时( timeout 指定等待时间,如果立即返回设为 null 即可)函数返回一个大于 0 的值,然后通过遍历文件描述符集合 fd_set ,来找到就绪的描述符 说明 : maxfdp 是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1。 fd_set 是以位图的形式来存储这些文件描述符。 maxfdp 也就是定义了位图中有效地位的个数 时间复杂度 : O(n) , n 为文件描述符集合 fd_set 的大小