首頁>Club>
9
回覆列表
  • 1 # 回憶是最好的74368472

    BIO是一個連線一個執行緒。

    NIO是一個請求一個執行緒。

    AIO是一個有效請求一個執行緒。

  • 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、AIO

    BIO:同步阻塞;一個請求過來,應用程式開了一個執行緒,等IO準備好,讀寫IO也是自己幹;但是為一個請求就啟動一個執行緒,開銷是比較大的,因為啟動和銷燬執行緒開銷很大,每個執行緒都要佔用記憶體,所以可以引入執行緒池,可以在一定程度上減少這些開銷;

    NIO:同步非阻塞;不用等待IO準備,準備好了會通知,不過IO操作還是要自己幹;NIO是一種多路複用機制,利用單執行緒輪詢事件,Channel來決定做什麼,避免連線數多的時候,頻繁進行執行緒切換導致效能問題(Select階段阻塞)。

    AIO:非同步非阻塞;因為事情不是自己做,其實也沒有阻塞一說(都是非阻塞);AIO是在NIO的基礎上,引入非同步通道的概念;NIO是採用輪詢的方式,不停地詢問stream中資料是否準備好了,準備好了就處理;AIO是向作業系統註冊IO監聽,作業系統完成IO操作了之後,主動通知,觸發響應的函式。

  • 4 # Big愛吃鬼

    BIO, 就是你去上廁所,坑被人佔了,你在那裡光等他好了

    NIO, 就是你你去上廁所,坑被人佔了,你不光等他,而是在外面乾點其他事,如:抽菸,玩會兒遊戲,然後時不時主動去看看有空閒的坑位沒

    AIO, 就是你去上廁所,廁所坑位被人佔了,你不光等他,而是出來再外面乾點其他事,然後等坑位好了,有人通知你有空坑位了

  • 中秋節和大豐收的關聯?
  • 你能接受女朋友和她的閨蜜一起喝酒喝很晚,而且喝得很多嗎?