Linux I O多路轉接poll技術

2021-09-26 00:07:22 字數 1786 閱讀 2378

上篇部落格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工作原理就是減少等的比重,同時監控多個檔案描述符 或者說檔案控制代碼 ...