Level_triggered(水平觸發): 當被監控的文件描述符上有可讀寫事件發生時,epoll_wait()會通知處理程序去讀寫。若是此次沒有把數據一次性所有讀寫完(如讀寫緩衝區過小), 那麼下次調用 epoll_wait()時,它還會通知你在上沒讀寫完的文件描述符上繼續讀寫,固然若是你一直不去讀寫,它會一直通知你!!!若是系統中有大量你不須要讀寫的就緒文件描述符,而它們每次都會返回,這樣會大大下降處理程序檢索本身關心的就緒文件描述符的效率!!!併發
Edge_triggered(邊緣觸發):當被監控的文件描述符上有可讀寫事件發生時,epoll_wait()會通知處理程序去讀寫。若是此次沒有把數據所有讀寫完(如讀寫緩衝區過小),那麼下次調用epoll_wait()時,它不會通知你,也就是它只會通知你一次,直到該文件描述符上出現第二次可讀寫事件纔會通知你!!!這種模式比水平觸發效率高,系統不會充斥大量你不關心的就緒文件描述符!!!函數
阻塞IO:當你去讀一個阻塞的文件描述符時,若是在該文件描述符上沒有數據可讀,那麼它會一直阻塞(通 俗一點就是一直卡在調用函數那裏),直到有數據可讀。當你去寫一個阻塞的文件描述符時,若是在該文件描述符上沒有空間(一般是緩衝區)可寫,那麼它會一直 阻塞,直到有空間可寫。以上的讀和寫咱們統一指在某個文件描述符進行的操做,不僅僅指真正的讀數據,寫數據,還包括接收鏈接accept(),發起鏈接 connect()等操做...高併發
非阻塞IO:當你去讀寫一個非阻塞的文件描述符時,無論可不能夠讀寫,它都會當即返回,返回成功說明讀寫操做完成了,返回失敗會設置相應errno狀態碼,根據這個errno能夠進一步執行其餘處理。它不會像阻塞IO那樣,卡在那裏不動!!!spa
select(),poll()模型都是水平觸發模式,信號驅動IO是邊緣觸發模式,epoll()模型即支持水平觸發,也支持邊緣觸發,默認是水平觸發。事件
1.對於監聽的sockfd,最好使用水平觸發模式,邊緣觸發模式會致使高併發狀況下,有的客戶端會鏈接不上。若是非要使用邊緣觸發,網上有的方案是用while來循環accept()。it
2.對於讀寫的connfd,水平觸發模式下,阻塞和非阻塞效果都同樣,不過爲了防止特殊狀況,仍是建議設置非阻塞。效率
3.對於讀寫的connfd,邊緣觸發模式下,必須使用非阻塞IO,並要一次性所有讀寫完數據。監控