此篇简要介绍一下epoll模型的内容。
select / poll / epoll
select、poll 和 epoll 三个都是 IO 多路复用的机制,可以监视多个描述符(fd)的读 / 写等事件。一旦某个描述符就绪(一般是读或者写事件发生了),就能够将发生的事件通知给关心的应用程序去处理该事件。
select 的缺点
- 每次调用 select,都需要把 fd 集合从用户态拷贝到内核态,这个开销在 fd 很多时会很大;
- 同时每次调用 select 都需要在内核遍历传递进来的所有 fd,这个开销在 fd 很多时也很大;
- select 支持的文件描述符数量只有 1024,非常小。
poll
poll 和 select 原理一样,不过相比较 select 而言,poll 可以支持大于 1024 个文件描述符。
epoll
相比较 select 和 poll,epoll 的最大特点是:
- epoll 现在是线程安全的,而 select 和 poll 不是。
- epoll 内部使用了 mmap 共享了用户和内核的部分空间,避免了数据的来回拷贝。
- epoll 基于事件驱动,epoll_ctl 注册事件并注册 callback 回调函数,epoll_wait 只返回发生的事件,避免了像 select 和 poll 对事件的整个轮询操作。