接口使用方便:虽然拆分成了三个函数,但是反而使用起来更方便高效,不需要每次循环都设置关注的文件描述符,也做到了输入输出参数分离 数据轻量拷贝:只在合适的时候调用 EPOLL_CTL_ADD 将文件描述符结构拷贝到内核中, 这个操作并不频 繁(而 select / poll 都是每次循环都要进行拷贝),开销变的很小 事件回调机制:避免...
1、select的可移植性好,因为在某些Unix系统上并不支持poll 和 epoll(极少)。 2、select 对于超时时间提供了更好的精度:微秒,而 poll 和 epoll 都是毫秒级。 【缺点】 1、select 支持监听的文件描述符fd的数量有限制,默认是1024个。(最大数量限制) 2、select 需要维护一个用来存放文件描述符fd的数据结构(fd_...
poll:poll是select的一种改进版,也能够同时监听多个文件描述符的可读、可写和异常事件。通过调用poll时传递关注的文件描述符数组,返回有事件发生的文件描述符,应用程序执行对应的读写操作。 epoll:epoll 是 Linux 特有的一种 I/O多路复用机制,相较于 select 和 poll 具有更高的性能,适用于高并发环境。epoll 使用...
(2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内部定义的等待队列)。这也能节省不少的开销。
2 相比select、poll,epoll的缺点: (1)Linux系统独有:epoll函数并不是Unix系统通用,所以不适合开发兼容性强的程序; (2)select、poll都只有一个函数,而epoll有三个(epoll_create,epoll_ctl和epoll_wait),操作起来更复杂,并且由于要实现回调机制,epoll的内部实现也更加复杂。如果并发量小且连接不频繁的话,最好使用...
select()的可移植性更好,在某些Unix系统上不支持poll()和epoll(); select() 对于超时值提供了更好的精度:微秒,而poll是毫秒。 【缺点】: 单个进程可监视的fd数量被限制(FD_SIZE为1024); 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大; ...
epoll: 1.没有select/poll的第一个问题,因为可以采用“边沿触发方式” 2.有限制,但是上限值是相当大的 3.使用mmap实现内存共享,复制开销比较小。 水平触发和边沿触发方式。 水平触发方式:如果报告的描述符未被处理,下次将重新被报告。 边沿触发方式:只报告发生变化的描述符,而且只报告一次。
缺点: 1)大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义。 2)poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd。 3、epoll 3.1 epoll概述 poll和select,它们的最大的问题就在于效率。它们的处理方式都是创建一个事件列表,然后把这...
select的可移植性好,但文件描述符数量有限且内存操作频繁。poll解决了数量限制,但内存复制开销大。epoll优化了这些,但不跨平台。在实际应用中,如连接数多且活跃较少,epoll效率更高,反之,select和poll可能更适用。学习和实践中需要注意用户态与内核态的交互方式,以及不同机制的适用场景。面试时,可能...
int epoll_create(int size); epoll_create是为了创建一个epoll文件描述符,新创建的epoll文件描述符带有一个struct eventpoll结构,eventpoll结构如下。 struct eventpoll { spinlock_t lock; struct mutex mtx; wait_queue_head_t wq; /* Wait queue used by sys_epoll_wait() ,调用epoll_wait()时, 我们就...