今天看到有文章說epoll里面用了mmap,還說進程不需要從內核讀數據,只需要從用戶態buffer讀數據就可以。覺得很神奇,就查了一下,發現完全不是描述的那樣。實際上,只是把要傳遞的fd通過mmap來傳遞的,而需要讀fd里面的數據的話,還是要程序通過read fd來讀的。如下:
這點實際上涉及到epoll的具體實現了。無論是select,poll還是epoll都需要內核把FD消息通知給用戶空間,如何避免不必要的內存拷貝就很重要,在這點上,epoll是通過內核於用戶空間mmap同一塊內存實現的。而如果你想我一樣從2.5內核就關注epoll的話,一定不會忘記手工 mmap這一步的。