IO模式與現實中的例子

前言數據庫

關於IO模式的區別,網絡上的文章一搜一大把,但每次閱讀時總以爲至關晦澀並且老容易混淆,俗話說好記性不如爛筆頭,因此乾脆本身寫一篇便於本身理解的文章以此幫助記憶和理解,不對之處還請輕噴,先謝謝!tomcat

1) 同步阻塞IO(Blocking IO)BIO
2) 同步非阻塞IO(Non-blocking IO)
3) IO多路複用(IO Multiplexing)注意: 它也是同步的,又叫New IO,即NIO
4) 異步IO(Asynchronous IO)AIO網絡

1、何謂阻塞?何謂同步?異步

如何區別同步IO仍是異步IO,是阻塞IO仍是非阻塞IO,主要區別是IO過程當中實際上是存在2個過程:1.發起IO過程 2.實際IO過程,若是過程1是須要等待的,那麼就是屬於阻塞IO,反之則是非阻塞IO,若是過程2中是須要等待的,那麼就是同步IO,反之則是屬於異步IO,爲啥都是等待的,一個叫阻塞一個叫同步呢?我的理解是這樣的:IO過程發生在AB之間,A至關於用戶線程或者網絡客戶端,B至關於系統線程或者網絡服務端,AB之間的訪問、調用過程分阻塞or非阻塞,可是真正的一個完整的IO過程實際上是由C參與的,這個C纔是真正IO的主體,至關於操做系統、數據庫等,那麼B和C之間的存取、讀寫過程分同步or異步socket

2、舉個栗子網站

阻塞or非阻塞,這個生活中最好理解的就是你要買東西,是你本身去買仍是讓你弟弟去買,你本身去買就是阻塞,讓你弟弟買回來再給你就是非阻塞,你弟弟買的時候你能夠幹其餘事情( 怎麼買的你先別管)操作系統

同步or異步,仍是舉上面那個例子,同步IO,是得你本身(阻塞)or你弟弟(非阻塞)不斷去京東網站上查詢物流到哪裏了?到了就你本身(阻塞)or你弟弟(非阻塞)跑去拿,典型的例子就是京東自提,異步IO呢?就是你網店下好單以後就甭管了,快遞員會自動把貨送到你或者你弟弟手上,典型的例子就是京東送貨上門線程

說到這裏應該不少同窗都應該能瞬間秒懂這幾個模式的區別了ip

上面BIO, NBIO,以及NIO都是同步的IO(後2者只是沒有阻塞發起方),只有AIO纔是真正異步的IO,Java也是在1.7纔開始支持AIO,Tomcat容器在AIO上實現叫APR,基於Native Library實現異步同步

3、重點談談NIO

很早之前Java和Tomcat就支持了BIO,這種模式最簡單,可是效率也最差,顯而易見大量時間都耗費在了等待IO上,而IO又正好是極其耗費時間的,因此如今基本上都是New IO(NIO) ,AIO因爲實現至關複雜還必須有操做系統支持,(聽說Netty的AIO實現比NIO效率還慢,因此放棄了,我沒詳細瞭解過)因此如今並無NIO普及,這裏重點討論一下NIO吧,NIO即經典的Reactor模式(Reactor最近是火哦)

好,仍是從生活中的例子入手吧,NIO是同步非阻塞+複用連接,你跟你弟弟說:我要買鼠標,而後小姐姐說:弟,我也要!,弟弟說:好,下單!,你跟小姐姐去逛街去了,你弟弟就不停的隔段時間查詢下網站,忽然發現小姐姐的快遞已經到家了,立刻通知小姐姐:姐!你快遞到了!,小姐姐馬上立刻結束逛街回到家領快遞,1個小時後你弟弟又告訴你說你的快遞到了,你又馬上拿了快遞,結束。

從這個例子能夠看出,你弟弟實際上是一個蠻重要的角色,對!沒錯,他就是NIO模式中的Reactor,負責查詢物流信息(select channel and read socket),發現socket可讀以後通知用戶線程讀取數據,因此從tomcat開啓NIO後吞吐量大增的現象就能夠發現,每一個請求就像一個個的小姐姐,tomcat裏有個小弟弟在輪訓等待IO結果並負責通知小姐姐結果。

相關文章
相關標籤/搜索