使用mmap加速內核與用戶空間的消息傳遞。
這 點實際上涉及到epoll的具體實現了。無論是select,poll還是epoll都需要內核把FD消息通知給用戶空間,如何避免不必要的內存拷貝就很 重要,在這點上,epoll是通過內核于用戶空間mmap同一塊內存實現的。而如果你想我一樣從2.5內核就關注epoll的話,一定不會忘記手工 mmap這一步的。
順便看一下 EPOLLET 和 EPOLLLT
EPOLLLT 是默認行為,基本上就是說,只要一個文件描述符處于就緒狀態,epoll 就會不停的通知你有事件發生。傳統的 select/poll 都是這樣的
這 點實際上涉及到epoll的具體實現了。無論是select,poll還是epoll都需要內核把FD消息通知給用戶空間,如何避免不必要的內存拷貝就很 重要,在這點上,epoll是通過內核于用戶空間mmap同一塊內存實現的。而如果你想我一樣從2.5內核就關注epoll的話,一定不會忘記手工 mmap這一步的。
順便看一下 EPOLLET 和 EPOLLLT
EPOLLLT 是默認行為,基本上就是說,只要一個文件描述符處于就緒狀態,epoll 就會不停的通知你有事件發生。傳統的 select/poll 都是這樣的
EPOLLET 是新的方式,只在一個文件描述符新處于就緒的時候通知一次,之后不管數據有沒有讀完,都不會再通知,當然,有新數據到還是會通知的。所以,用 EPOLLET 的時候,一定要把文件描述符設置為 non-blocking,而且最好是一直讀數據,讀到返回 EAGAIN 才停下
EPOLLOUT事件:
EPOLLOUT事件只有在連接時觸發一次,表示可寫,其他時候想要觸發,那要先準備好下面條件:
1.某次write,寫滿了發送緩沖區,返回錯誤碼為EAGAIN。
2.對端讀取了一些數據,又重新可寫了,此時會觸發EPOLLOUT。
簡單地說:EPOLLOUT事件只有在不可寫到可寫的轉變時刻,才會觸發一次,所以叫邊緣觸發,這叫法沒錯的!
其實,如果真的想強制觸發一次,也是有辦法的,直接調用epoll_ctl重新設置一下event就可以了,event跟原來的設