-
1 # 回憶是最好的74368472
-
2 # 淺析架構
首先需要明白阻塞 非阻塞 同步 非同步的概念,這裡引用下史蒂文斯的《UNIX網路程式設計》中的幾張圖。
阻塞IO
圖中可以看到阻塞IO,一直阻塞在recvfrom方法呼叫上,直接資料複製完成
非阻塞IO
圖中可以看到非阻塞IO呼叫的recvfrom方法如果無資料直接返回,應用程序可以不斷輪詢是否有資料
IO複用
圖中可以看到IO複用,程序不再去輪詢獲取資料了,而是有select去檢視資料是否準備好,準備好了,你再呼叫recvfrom方法去讀取資料
非同步IO
非同步IO,你發起系統呼叫,連資料都不用自己去讀取,而是作業系統直接給你複製到使用者空間,再回調你。
所以說同步和非同步是針對使用者空間和核心空間互動而言的,而阻塞和非阻塞是針對使用者程序訪問資料而言的。強烈推薦下《UNIX網路程式設計》。
BIO
java中的BIO是同步阻塞的。先看下服務端的例子
ServerSocket
這裡例項下ServerSocket的使用方法,可以看出一個連線過來就需要建立一個執行緒來處理連線,這裡可以使用執行緒池進行最佳化。
NIO
NIO的使用和注意的地方我都寫圖裡了。
NIO就是同步非阻塞,連線請求都會註冊到多路複用器上,多路複用器輪詢到連線有I/O請求時才進行處理,還是需要使用者自己去讀取資料,所以是同步的,但是不用阻塞在IO執行緒上,所以是非阻塞的。
學習NIO,還需要學習下 Buffer、Channel的使用。
Buffer
Buffer 可以理解為一個數組,可以進行資料的讀寫。在使用NIO的時候,我們的資料必須透過buffer和Channel進行互動。
Buffer 三個重要屬性:position、limit、capacity。
capacity:它代表這個緩衝區的容量,一旦設定就不可以更改。
position :初始值是 0,每寫入一個值,position 就自動加 1。讀也是類似的,每讀一個值,position 就自動加 1。寫操作切換讀操作的時候,可以呼叫flip,position 會歸零,這樣就可以從頭開始讀寫了。
limit:初始狀態下,limit 代表的是最大能寫入的資料,這個時候 limit 等於 capacity。呼叫flip後limit 等於 Buffer 中實際的資料大小,可以小於capacity。
Channel
Channel 通道,用於進行讀寫操作。一般使用channel.read(buffer) 和 channel.write(buffer)來讀寫資料。和流類似,但流是單向的,Channel是雙向的。
-
3 # 會點程式碼的大叔
先需要了解幾個概念:同步和非同步,阻塞和非阻塞。
同步和非同步同步:程序觸發IO操作的時候,必須親自處理;你必須親自去銀行取錢。
非同步:程序觸發IO操作的時候,可以不親自處理,它把操作委託給OS處理,委託的時候需要告知資料的地址和大小,然後自己去做別的事情,當IO操作結束後會得到通知;你把銀行卡給我,讓我幫你去銀行取錢,你需要告訴我銀行卡密碼和取多少錢,我取完了之後把錢給你。
總結:自己幹就是同步,別人幹就是非同步。
阻塞和非阻塞阻塞:程序觸發IO操作的時候,如果此時此時沒辦法讀或者寫,那麼程序就一直等待,直到讀寫結束;比如你去銀行ATM取錢,前面有人在排隊,那麼就要一直等待,直到你取完錢;
非阻塞:程序觸發IO操作的時候,如果此時此時沒辦法讀或者寫,那麼就先去做別的,等到有通知後,再繼續讀寫;比如你去銀行櫃檯取錢,人比較多,那就先領一個號,等著叫到號再去對應的視窗辦理業務;這裡不太恰當的是,我們等待的過程中,還得聽著叫號。
總結:我要等著不能做其他事就是阻塞,我不用等可以做其他事就是非同步。
BIO、NIO、AIOBIO:同步阻塞;一個請求過來,應用程式開了一個執行緒,等IO準備好,讀寫IO也是自己幹;但是為一個請求就啟動一個執行緒,開銷是比較大的,因為啟動和銷燬執行緒開銷很大,每個執行緒都要佔用記憶體,所以可以引入執行緒池,可以在一定程度上減少這些開銷;
NIO:同步非阻塞;不用等待IO準備,準備好了會通知,不過IO操作還是要自己幹;NIO是一種多路複用機制,利用單執行緒輪詢事件,Channel來決定做什麼,避免連線數多的時候,頻繁進行執行緒切換導致效能問題(Select階段阻塞)。
AIO:非同步非阻塞;因為事情不是自己做,其實也沒有阻塞一說(都是非阻塞);AIO是在NIO的基礎上,引入非同步通道的概念;NIO是採用輪詢的方式,不停地詢問stream中資料是否準備好了,準備好了就處理;AIO是向作業系統註冊IO監聽,作業系統完成IO操作了之後,主動通知,觸發響應的函式。
-
4 # Big愛吃鬼
BIO, 就是你去上廁所,坑被人佔了,你在那裡光等他好了
NIO, 就是你你去上廁所,坑被人佔了,你不光等他,而是在外面乾點其他事,如:抽菸,玩會兒遊戲,然後時不時主動去看看有空閒的坑位沒
AIO, 就是你去上廁所,廁所坑位被人佔了,你不光等他,而是出來再外面乾點其他事,然後等坑位好了,有人通知你有空坑位了
回覆列表
BIO是一個連線一個執行緒。
NIO是一個請求一個執行緒。
AIO是一個有效請求一個執行緒。