select/poll/epoll事件驱动

来源:互联网 发布:python二维数组 编辑:程序博客网 时间:2024/06/07 01:55

       一直用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

0 0
原创粉丝点击