聊聊epoll的水平觸發和邊緣觸發
阿新 • • 發佈:2019-02-20
一句話總結:水平觸發下epoll_wait在檔案描述符沒有讀寫完會一直觸發,而邊緣觸發是可讀寫時觸發一次。
類別 |
情況 |
水平觸發的非阻塞監聽sockfd |
高併發情況下,fd一個一個取,不會漏掉 |
邊緣觸發的非阻塞監聽sockfd |
高併發情況下可能會有漏掉的情況 |
水平觸發的阻塞連線connfd |
資料一次沒有取完,會一直觸發直到取完 |
水平觸發的非阻塞連線connfd |
資料一次沒有取完,會一直觸發直到取完 |
邊緣觸發的阻塞連線connfd |
如果不一次性讀完,沒讀完的資料在下一次邊緣觸發時會被讀出來;如果用迴圈讀,讀完資料會阻塞在recv |
邊緣觸發的非阻塞 |
如果不一次性讀完,沒讀完的資料在下一次邊緣觸發時會被讀出來;需一次性讀完,快取不夠就用迴圈讀 |
說明:
1、以上沒有驗證阻塞的監聽sockfd,因為socket連線與accept無關,epoll_wait()返回必定是已就緒的連線,設不設定阻塞accept()都會立即返回。不考慮socket連線後在accept之前又斷開導致accept阻塞的情況
2、監聽socket最好是水平觸發
3、連線socket水平觸發模式下建議是非阻塞
4、連線socket邊緣觸發模式下必須用非阻塞,資料一次性讀完不要干擾下次的資料