select,poll,epoll與IO模型

幾個基礎概念

流與IO操作

可以進行I\O操作的內核對象,例如文件、管道、套接字……

流的入口:文件描述符(fd)

所有對流的讀寫操作,我們都可以稱之爲IO操作。

阻塞

         

阻塞等待: 空出大腦可以安心睡覺。(不佔用CPU寶貴的時間片)

解決阻塞死等的辦法

(1)忙輪詢

非阻塞,忙輪詢: 浪費時間,浪費電話費,佔用快遞員時間(佔用CPU,系統資源)

(2)select

 

select 代收員比較懶,她只會告訴你快遞到了,但是是誰到的,你需要挨個快遞員問一遍

select、poll的幾大缺點:

  • 每次調用select,都需要把fd集合從用戶態拷貝到內核態,這個開銷在fd很多時會很大 
  • 同時每次調用select都需要在內核遍歷傳遞進來的所有fd,這個開銷在fd很多時也很大 
  • select支持的文件描述符數量太小了,默認是1024
  • poll的實現和select非常相似,只是描述fd集合的方式不同

(3)epoll(主角出場)

epoll特點好處:

與select,poll一樣,但是增加了I/O多路複用的技術;

只關心“活躍”的鏈接,無需遍歷全部描述符集合;

能夠處理大量的鏈接請求(系統可以打開的文件數目)

IO模型 

POSIX(可移植操作系統接口)把同步IO操作定義爲導致進程阻塞直到IO完成的操作,反之則是異步IO

按POSIX的描述似乎把同步和阻塞劃等號,異步和非阻塞劃等號,但是爲什麼有的人說同步IO不等於阻塞IO呢?先來說說幾種常見的IO模型吧。

(1)阻塞IO模型

A同學用杯子裝水,打開水龍頭裝滿水然後離開。這一過程就可以看成是使用了阻塞IO模型,因爲如果水龍頭沒有水,他也要等到有水並裝滿杯子才能離開去做別的事情。很顯然,這種IO模型是同步的。

(2)非阻塞IO模型

B同學也用杯子裝水,打開水龍頭後發現沒有水,它離開了,過一會他又拿着杯子來看看……在中間離開的這些時間裏,B同學離開了裝水現場(回到用戶進程空間),可以做他自己的事情。這就是非阻塞IO模型。但是它只有是檢查無數據的時候是非阻塞的,在數據到達的時候依然要等待複製數據到用戶空間(等着水將水杯裝滿),因此它還是同步IO。

(3)IO複用模型(select,poll,epoll

這種IO模型比較特別,分個段。因爲它能同時監聽多個文件描述符(fd)。這個時候C同學來裝水,發現有一排水龍頭,舍管阿姨告訴他這些水龍頭都還沒有水,等有水了告訴他。於是等啊等(select調用中),過了一會阿姨告訴他有水了,但不知道是哪個水龍頭有水,自己看吧。於是C同學一個個打開,往杯子裏裝水(recv)。這裏再順便說說鼎鼎大名的epoll(高性能的代名詞啊),epoll也屬於IO複用模型,主要區別在於舍管阿姨會告訴C同學哪幾個水龍頭有水了,不需要一個個打開看(當然還有其它區別)。

(4)信號驅動IO模型

D同學讓舍管阿姨等有水的時候通知他(註冊信號函數),沒多久D同學得知有水了,跑去裝水。是不是很像異步IO?很遺憾,它還是同步IO(省不了裝水的時間啊)。

(5)異步IO模型

E同學讓舍管阿姨將杯子裝滿水後通知他。整個過程E同學都可以做別的事情(沒有recv),這纔是真正的異步IO。

總結:

IO分兩階段:

1.數據準備階段
2.內核空間複製回用戶進程緩衝區階段

一般來講:阻塞IO模型、非阻塞IO模型、IO複用模型(select/poll/epoll)、信號驅動IO模型都屬於同步IO,因爲階段2是阻塞的(儘管時間很短)。只有異步IO模型是符合POSIX異步IO操作含義的,不管在階段1還是階段2都可以幹別的事。

參考1:https://blog.csdn.net/qq_35433716/article/details/85345907 

參考2:https://www.cnblogs.com/felixzh/p/10345929.html 

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