epoll、select、poll总结--笔记

select、poll:

  这两种机制在实现上其实差不多。所以以select为例,下面是使用select的时候的大致过程。

  1、用户传入需要监听的fd_set,之后会通过系统调用将这些fd_set从用户态空间拷贝到内核态的空间。

  2、当有描述符可读写的时候,select返回,此时会将fd_set重新拷贝回用户空间,注意此时fd_set中可读写的描述符已经做了标记。

  3、在用户程序中要判断某个描述符是否可读写,用宏FD_ISSET来判断。如果有多个描述符需要处理,只能一个一个依次查询。

  由此可以看出,使用select的时候,主要有以下2个问题。

  1. fd_set频繁在用户态空间和内核态空间之间拷贝,这花销是不必要的。
  2. 返回的是整个fd_set,但是如果只有少数的描述符就绪,依然还得遍历整个fd_set。所以这一步也做了不必要的开销。

 

epoll:

  epoll通过三个关键点来避免了上述的几个开销:

  1、利用共享内存避免了用户态空间和内核态空间之间频繁的拷贝。实际上将用户态进程和内核态映射到了同一个物理页上面去。这样就能直接共享,避免描述符不必要的拷贝。

  2、用红黑树数据结构进行高效的描述符添加和删除。

  3、epoll机制在描述符就绪之后,会调用回调函数,将就绪的描述符添加到一个就绪队列中。这样就避免了轮询操作。因为就绪队列中的描述符都是就绪的。

 

这是对三种机制简单总结。感觉自己还有很多似懂非懂的地方,想到再补充,坑待填。。。

http://blog.chinaunix.net/uid-28541347-id-4232252.html

posted on 2017-10-12 17:04  林伏案  阅读(156)  评论(0)    收藏  举报

导航