epoll、select、poll总结--笔记
select、poll:
这两种机制在实现上其实差不多。所以以select为例,下面是使用select的时候的大致过程。
1、用户传入需要监听的fd_set,之后会通过系统调用将这些fd_set从用户态空间拷贝到内核态的空间。
2、当有描述符可读写的时候,select返回,此时会将fd_set重新拷贝回用户空间,注意此时fd_set中可读写的描述符已经做了标记。
3、在用户程序中要判断某个描述符是否可读写,用宏FD_ISSET来判断。如果有多个描述符需要处理,只能一个一个依次查询。
由此可以看出,使用select的时候,主要有以下2个问题。
- fd_set频繁在用户态空间和内核态空间之间拷贝,这花销是不必要的。
- 返回的是整个fd_set,但是如果只有少数的描述符就绪,依然还得遍历整个fd_set。所以这一步也做了不必要的开销。
epoll:
epoll通过三个关键点来避免了上述的几个开销:
1、利用共享内存避免了用户态空间和内核态空间之间频繁的拷贝。实际上将用户态进程和内核态映射到了同一个物理页上面去。这样就能直接共享,避免描述符不必要的拷贝。
2、用红黑树数据结构进行高效的描述符添加和删除。
3、epoll机制在描述符就绪之后,会调用回调函数,将就绪的描述符添加到一个就绪队列中。这样就避免了轮询操作。因为就绪队列中的描述符都是就绪的。
这是对三种机制简单总结。感觉自己还有很多似懂非懂的地方,想到再补充,坑待填。。。
http://blog.chinaunix.net/uid-28541347-id-4232252.html
浙公网安备 33010602011771号