一直用select, 没有使用poll和Epoll, 近来需要使用Epoll。以前面试时,有人问过我, 我也简单作答。
现在写一下我的理解。
三者区别:
select: 监听的文件描述符有限制,linux系统默认是1024
poll:和select差不多, 比select优越的地方是监听的文件描述符个数可以不限
epoll:
1) 监听的文件描述符个数不限
2) select/poll有事件时,会无差别遍历所有文件描述符,依次判断是否有数据,复杂度为O(n); 而epoll 会把哪个流发生了怎样的I/O事件通知我们,复杂度为O(1)。显然epoll优势明显。(具体用法google一下)
select/poll:
while true
{
select/poll(streams[])
for i in streams[]
{
if i has data
read / write until unavailable
}
}
Epoll:
while true
{
active_streams[] = epoll_wait(epollfd)
for i in active_streams[]
{
read /write complete
}
}
3) epoll 包含 ET 和 LT两种模式。LT模式是默认的。
LT模式和select/poll一致, 判断FD是否readable/writeable。只要FD可读或可写,即触发事件
ET模式, 只有FD变化时,才触发事件。故数据要一次读/写完才行。
PS : select /poll 可用于阻塞/非阻塞IO
epoll : LT模式和 select/poll一致, 但ET模式只能用于非阻塞IO
相关资料:
http://yaocoder.blog.51cto.com/2668309/888374
http://blog.csdn.net/eroswang/article/details/4481521