上篇部落格i/o多路轉接select技術筆者已經為大家詳細介紹了select函式的使用方式以及特點。我們在文章最後總結的時候我們提到,select雖然已經很大程度上解決了i/o過程中等待的問題,但是由於函式本身介面設計的不友好、能夠檢測的檔案描述符有上限,以及函式多次迴圈遍歷的效率問題導致select在實際場景中並不是使用的那麼廣泛。
今天我們要介紹的poll函式從一定程度上對select進行了優化,那麼具體是怎麼優化的,讓我們一**竟。
int
poll
(struct pollfd *fds, nfds_t nfds,
int timeout)
;
引數介紹:
struct pollfd:在/usr/include/asm-generic/poll.h標頭檔案下成功找到了這個結構體
事件有:這些事件events和revents都會發生
事件描述
pollin
有資料可讀
pollrdnorm
有普通資料可讀
pollrdband
有優先資料可讀
pollpri
有緊迫資料可讀
pollout
寫資料不會導致阻塞
pollwrnorm
寫普通資料不會導致阻塞
pollwrband
寫優先資料不會導致阻塞
pollmsgsigpoll
訊息可用
只發生在revents中的額外事件:
事件描述
poller
指定的檔案描述符發生錯誤
pollhup
指定的檔案描述符掛起事件
pollnval
指定的檔案描述符非法
從上面的介紹中來看,僅從函式簽名就能發現poll比select函式友好很多。這裡poll函式將自己的所關心的事件全部整合在一起,設定時往events點陣圖中設定,而條件就緒時則使用revents點陣圖設定返回。
看了poll函式你就會發現,poll函式其實是select函式的優化版本。select函式和poll函式相比並沒有優點,poll函式的出現很大程度上是用來彌補select函式的缺點的,那麼poll函式到底相比select進行了哪些優化呢?
引數分離:select實際上將輸入輸出引數混為一談,所以也就導致必須使用額外的陣列來儲存要關注的檔案描述符。每經過一輪處理就需要重新遍歷陣列進行再次設定,這極大影響了效率。而poll函式使用pollfd陣列的方式將這些要關心的檔案描述符管理起來,這就避免了每經過一次處理後下次檢測之前重新設定的缺點
檔案描述符無上限:俗話說人有多大膽,地有多大產。poll並沒有規定所能檢測檔案描述符的最大上限,雖然函式引數要傳乙個固定值,但是這個固定值只要系統能處理過來,多大都可以
poll函式優化了引數和檔案描述符上限的問題,可是我們要想明白使用多路轉接技術到底是為了什麼。多路轉接就是為了優化阻塞式i/o等待時間較長的問題,而poll只優化了上面的倆點好像並沒有讓效率提高很多。
poll和select的共同問題:
下篇部落格我們就要講多路轉接技術最後的主角epoll了,之所以select和poll沒有將要談到的epoll好是因為光從迴圈遍歷這個缺點來看,某種情況下select和poll就是不合格的,舉個栗子
經過select和poll函式的介紹,你會發現這兩個函式還是存在一些列的缺點的。下篇部落格要談的epoll函式真的是讓人驚豔的設計,今天所提到的問題epoll函式都能解決。那麼epoll到底是哪路神仙我們下篇部落格見。
Linux I O多路轉接poll
不同與select使用三個點陣圖來表示三個fdset的方式,poll使用 乙個 pollfd的指標實現。poll函式和select函式的任務相似 等待一組檔案描述符來準備執行i 0。引數 1 第乙個引數 fds struct pollfd 2 第二個引數 nfds nfds用來表示要監視檔案描述符的...
Linux I O多路轉接 poll模型
1.poll模型屬於i o多路轉接模型,是對select模型的一種優化 int poll struct pollfd fds,nfd t nfds,int timeout 2.poll的優點 poll使用陣列儲存檔案描述符,所以能描述的檔案描述個數在理論上沒有上限 poll將輸入輸出型引數進行了分離...
Linux I O多路轉接select
系統提供select函式來實現多路復用輸入 輸出模型,那為什麼提供select函式?首先要知道乙個概念,一次i o分兩個部分 等待資料就緒 進行i o 減少等待資料的的比重,增加i o的比重就可以達到高效伺服器的目的。select工作原理就是減少等的比重,同時監控多個檔案描述符 或者說檔案控制代碼 ...