今天看到有文章说epoll里面用了mmap,还说进程不需要从内核读数据,只需要从用户态buffer读数据就可以。觉得很神奇,就查了一下,发现完全不是描述的那样。实际上,只是把要传递的fd通过mmap来传递的,而需要读fd里面的数据的话,还是要程序通过read fd来读的。如下:

这点实际上涉及到epoll的具体实现了。无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。而如果你想我一样从2.5内核就关注epoll的话,一定不会忘记手工 mmap这一步的。

05-04 03:08