天天看點

NIO-select和epull

關于io估計點選到這裡的或多或少對bio,nio,aio,  阻塞,非阻塞,同步異步已經有了初步的了解,但是還是很迷茫,   到底這幾個名詞有什麼差別和聯系?

我直接抛出結論吧:

1: IBM的技術網站上有個家夥寫了篇文章将IO分為 四個象限, 同步阻塞,同步非阻塞, 異步阻塞,異步非阻塞,   這篇文章是錯的,不要覺得IBM就一定正确

2:csdn和知乎上很多高分回答,99%也是錯的,   在知乎上  https://www.zhihu.com/question/19732473 地下的評論和舉例子也挺多, 大部分也是也是錯的

 陳碩的回答是正确的,我copy過來,不過他并沒有做詳細的解釋:   

在處理 IO 的時候,阻塞和非阻塞都是同步 IO。隻有使用了特殊的 API 才是異步 IO。

NIO-select和epull

 正确的劃分是,從兩個步驟看問題,一次IO請求經曆兩個階段:

1: 使用者态發起請求到核心态 ,核心傳回結果

2: 核心将IO内容傳回給使用者态程式

如果在使用者态程式發起請求一直到使用者态擷取到資料都需要等待,那麼這種IO模型就是同步模型,     這裡來看,BIO一定是同步模型,nio隻是在第一步沒有等待

但是在發現核心告訴他有資料産生了,然後使用者态程式自己🈶發起一次調用,也就是關鍵的第二部中還是需要等待,  是以nio也是同步模型

是以select,  poll  epull是同步非阻塞模型, nio是同步阻塞模型,   隻有aio是真正的異步模型,  沒有異步阻塞或者異步非阻塞模型這一說.

接下來說,  select模型是因為有1024的最大并發限制,盡管可以修改,但是限于作業系統限制,也不會太大,

                 pull模型是在select的基礎上,去掉了最大連接配接數限制,

                epull是在pull模型上,輪訓fid(就是網絡連接配接socket)的時候,隻處理發生了IO事件的fid,   提升了響應效率

具體的這方面倒是網文挺多,後邊可以詳細補充下