select poll epoll io複用函數
n=select
n==-1 失敗
n==0 超時
n>0 有n個描述符數據就緒
select 監聽描述符上有沒有用戶關心的事件(讀、寫、異常)
poll() 同select
1、每次循環。都要給內核拷貝描述符和事件的集
2、輪詢的方式檢測描述符上是否有事件就緒 O(n)
3、返回後,遍歷集合中就緒的 O(n)
epoll():把用戶關心的文件描述符上的事件放在內核的事件表中,從而無須像select poll那樣每次調用都要重複傳入文件描述符集和事件集
epoll_create() 創建內核事件表 --紅黑樹
epoll_cti()向內核事件表中方添加 修改 移除
epoll_wait()獲取有就緒事件的描述符(監聽)
select poll
1、每次循環都要將描述符和事件傳到內核空間
2、內核實現:輪詢 O(n)
3、io函數返回後,需要遍歷所有描述符,找到就緒的
select poll不適合epoll適合:
不適合描述符多的場景,尤其是描述符多,但每次就緒數目比較少的場景
sockfd上有數據:客戶端connect服務器成功後,或說tcp客戶端鏈接服務器時,sockfd上有讀事件就緒
c上有數據: 對方客戶端send發送數據,c有讀事件就緒
epoll
LT:io函數反覆提醒用戶有數據(事件),直到用戶處理完當前所有數 阻塞非阻塞(都可以)
ET:只提醒一次,無論用戶有沒有處理完 非阻塞(只能是)