Linux -- select 與 poll 事件模型詳解

select 與 poll 工作原理:

1、select 主要是採用輪詢的方式來實現對就緒的 fd 處理:
2、poll 和 select 基本相同,主要不同在於 poll 沒有對 fd 數量限制
 

工作模型:

Linux -- select 與 poll 事件模型詳解

工作流程:

1、用戶態創建了網絡 IO 連接,假設一個 socket 連接就是一個 fd 文件描述符,那麼將 fd 添加到 fd_set 集合中
2、將 fd_set 集合從用戶態 copy 到內核態
3、遍歷這個 fd_set 集合,找出所有已經就緒的 fd,執行對應 fd 的相關操作
4、將內核態的 fd_set 集合拷貝到用戶態

僞代碼:

 fd = iosocket_coonnect()  #建立網絡連接
 fd_set.add(fd)  #向fd_set集合中添加fd
 copy_from_user(fd_set)   #從用戶態拷貝 fd_set 到內核態
 for fd in fd_set:   #遍歷 fd_set 對就緒的 fd 執行相關操作
     doing(fd)

 

缺點:

1、每次調用 select ,都需要把 fd 集合從用戶態拷貝到內核態,當 fd 比較大的時候,開銷大
2、每次都需要對 fd_set 集合進行遍歷,開銷比較大
3、select 可支持的 fd 描述符比較少,一般是1024 或2048, 可以修改,從新編譯內核實現增大,到時效果不好

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