常見的網絡IO模型(BIO、NIO、AIO等)

首先說一下這裏單獨指的是網絡IO,咱們再這個基礎去探討。linux

IO,分爲兩個步驟,第一步是等待數據階段,數據放入系統內核。第二步是從系統內核複製到內存,這裏就能夠被應用程序使用了。網絡

先簡單抽象一下我的的理解,而後在詳細解釋一下IO模型的具體細節。多線程

BIO(阻塞IO),在第一步阻塞,第二步阻塞。接收多個請求能夠經過多線程來處理,但對資源的耗費太高。併發

NIO(非阻塞IO),在第一步非阻塞,第二步阻塞。在第一步操做異步也就節省了對線程資源的佔用(這一步耗時是較長的),所以對併發的支持大大的提高。框架

從上圖,能夠看到第一步孫然非阻塞了,但還須要輪詢須要的結果,這時候就會想有沒有更好的辦法。異步

 

多路複用IO(IO multiplexing),使用select() 的事件驅動模型只用單線程(進程)執行,佔用資源少,不消耗太多 CPU,同時可以爲多客戶端提供服務。但這個模型依舊有着不少問題。首先select()接口並非實現「事件驅動」的最好選擇。由於當須要探測的句柄值較大時,select()接口自己須要消耗大量時間去輪詢各個句柄。不少操做系統提供了更爲高效的接口,如linux提供了epoll,BSD提供了kqueue等。操作系統

AIO(異步IO),在第一步、第二步都是非阻塞。目前來講我的感受使用情景較少暫時不過多介紹。線程

總結:上面介紹的io模型爲概念,和系統級別的,而實際開發階段有好友框架供使用,如netty、Quasar等,有時間後面寫一篇 netty快速開發入門的文章。上面均爲我的理解,若有錯誤歡迎指正和交流。netty

技術交流羣:208779755blog

相關文章
相關標籤/搜索