select() poll() epoll()

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:只提醒一次,無論用戶有沒有處理完    非阻塞(只能是)
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章