1. 程式人生 > >仰望星空的同時,也要學會腳踩泥坑

仰望星空的同時,也要學會腳踩泥坑

  • 什麼是NIO?

    1. NIO全稱Nonblocking IO 也曾為 new IO(NIO),即同步非阻塞式IO。
    2. 基於事件驅動思想,採用Reactor模式,實現多路IO複用
    3. 在Socket主要的讀、寫、註冊和接收函式,在等待就緒階段都是非阻塞式的,真正的IO操作是同步阻塞的。
  • NIO和標準IO的區別

    1. 標準IO,基於字元流(byte)和位元組流(char)。
    2. NIO,基於通道(channel)和緩衝(buffer)。即,陣列總是從通道讀取到緩衝區,或者從緩衝區寫入到通道。 關鍵點:讀寫操作物件,都是通道,即面向通道程式設計。
    3. 其一,標準IO是面向流的,而NIO是面向緩衝區的。其二,標準IO流是阻塞的,NIO是非阻塞的。其三,NIO有選擇器(Selectors),而標準IO沒有。
  • NIO特性:channels,buffers,selectors

    1. 通道(channels),在NIO中通道和流的概念很相似,但和流有幾點區別
      • 通道可讀可寫,流一般是單向的,即只能讀或只能寫。
      • 通道可以非同步讀寫。
      • 通道總是基於緩衝區Buffers來讀寫 在這裡插入圖片描述
    2. 緩衝區(Buffers),NIO利用緩衝區和通道互動。
      • Buffers本質是一塊記憶體區,可以用來寫入資料,並在稍後讀取出來。該記憶體區被NIO Buffer包裹起來,對外提供一些了讀寫操作介面。
      • 緩衝區基本屬性:capatity,position,limit
        1. 容量(capatity):表示buffer最大資料量,緩衝區不能為負,並且建立後不能修改。
        2. **位置(**position):下一個要讀取或寫入資料的索引,緩衝區position不能為負,並且不能大於limit。
        3. 限制(limit):第一個不應該讀取或寫入資料的索引,即位於limit後的資料不可讀寫。緩衝區的limit不能為負,且不能大於capatity。
    3. 選擇器(selectors):選擇器,也成為多路複用器。
      • Selectors是NIO核心元件之一,用於檢查一個或多個通道的狀態是否可用,即是否可讀可寫。基於此,可以實現單執行緒管理多個通道,也就是可以管理多個網路連線。
      • 同一個channel的selector不能被併發呼叫,因此如果有多個IO執行緒,必須保證一個Socket只屬於一個IOThread,而一個IOTread可以管理多個Socket。
      • 一個執行緒可以使用多個通道(channel),因此會造成每個通道傳輸效率降低。 在這裡插入圖片描述
  • 結合事件驅動模型理解NIO非阻塞式特性

    1. 在瞭解NIO為什麼不用開多執行緒,就能提高CPU利用之前,先看BIO模型。開多執行緒的解決BIO利用CPU率較低的原因有一下幾點原因:
      • 其一,沒有辦法知道到底什麼時候可以讀寫,所以就只能一直等待。即在Api上的體現。socket.read()和socket.write()沒有返回值,無法進行有效的中斷,所以並不知道什麼時候可讀寫。
      • 其二,就其原因在進行IO操作的時候,無法通過事件預知什麼時候可以進行讀寫操作,所以在BIO中只能通過多執行緒,提高CPU利用率。
    2. NIO的讀寫函式,可以立刻返回,這就給不開執行緒利用CPU提供最好機會。
      • 如果一個連線不可用(讀寫),那麼NIO的讀寫函式會返回0,表示連線不可讀寫。這時候,我們可以將該返回值記錄在Selectors(選擇器)上的註冊標記位,然後切換到其他就緒的通道(Channel)上。
      • NIO主要幾個事件:讀就緒,寫就緒,有新連線到來。