epoll、select、poll区别
This is my study note of file system startup process.
select
1 | 单个进程就可以同时处理多个网络连接IO请求,基本原理就是程序呼叫select,然后整个程序进入阻塞状态,这时候 |
缺点:
- 每次调用select都要把fd集合从用户态拷贝到内核态,开销大
- 每次都要在内核中遍历fd集合,开销大
- select的描述符数量太少,只有1024
poll
1 | 描述fd集合的方式不同,poll使用的是pollfd结构,select使用fd_set结构,polled是链式结构,因此最大连接数不限。 |
epoll
- epoll_create 创建一个epoll对象,并返回fd
- epoll_ctl 事件注册函数,将需要监听的事件和fd交给epoll
- epoll_wait 等待注册事件触发或者timeout发生
1
2
3
4epoll没有fd的限制,每个epoll监听一个fd,epoll不需要每次都从用户空间将fd_set复制到内核空间,在使用注册函数的
时候,fd已经被复制到内核中,不需要每次都重新复制一次,epoll是被动触发方式,创建对应的fd时指明一个回调函数,当
数据准备好时就会把就绪的fd加入一个就绪队列中,epoll_wait就是查看队列中是否存在就绪的fd,如果有就唤醒队列上的
等待者,然后调用回调。
简单一句话概括就是poll、select是知道有事件就绪了,但是不知道是哪个事件,而epoll知道事件就绪的同时还知道是哪个
事件发生。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 风声向寂!
评论
ValineDisqus