【高併發】四、NIO 簡介

一、介紹

1、在1.4版本之前,Java IO類庫是阻塞IO;從1.4版本開始,引進了新的異步IO庫,被稱爲JavaNew IO類庫,簡稱爲JAVA NIO。

2、New IO類庫的目標,就是要讓Java支持非阻塞IO,基於這個原因,更多的人喜歡稱Java NIO爲非阻塞IO(Non-Block IO),稱“老的”阻塞式Java IO爲OIO(Old IO)。

3、NIO彌補了原來面向流的OIO同步阻塞的不足,它爲標準Java代碼提供了高速的、面向緩衝區的IO。

4、Java NIO由以下三個核心組件組成

Channel(通道)、 Buffer(緩衝區)、 Selector(選擇器)

二、NIO和OIO

1、OIO是面向流(Stream Oriented)的,NIO是面向緩衝區(Buffer Oriented)的。

  1. 什麼是面向流?

OIO是面向字節流或字符流的,在一般的OIO操作中,以流式的方式順序地從一個流(Stream)中讀取一個或多個字節,因此,不能隨意地改變讀取指針的位置。

  1. 什麼是面向緩衝區?

在NIO操作中則不同,NIO中引入了Channel(通道)和Buffer(緩衝區)的概念。讀取和寫入,只需要從通道中讀取數據到緩衝區中,或將數據從緩衝區中寫入到通道中。NIO不像OIO那樣是順序操作,可以隨意地讀取Buffer中任意位置的數據。

2、OIO的操作是阻塞的,而NIO的操作是非阻塞的。

  1. OIO操作都是阻塞的,調用一個read方法讀取一個文件的內容,那麼調用read的線程會被阻塞住,直到read操作完成。
  1. 在NIO的非阻塞模式中,當我們調用read方法時,如果此時有數據,則read讀取數據並返回;如果此時沒有數據,則read直接返回,而不會阻塞當前線程。NIO的非阻塞,NIO使用了通道和通道的多路複用技術。

3、OIO沒有選擇器(Selector)概念,而NIO有選擇器的概念。NIO的實現,是基於底層的選擇器的系統調用。NIO的選擇器,需要底層操作系統提供支持。而OIO不需要用到選擇器。

三、NIO 三大組件

1、通道(Channel)

  1. 在OIO中,同一個網絡連接會關聯到兩個流:一個輸入流(Input Stream),另一個輸出流(Output Stream)。通過這兩個流,不斷地進行輸入和輸出的操作。
  1. 在NIO中,同一個網絡連接使用一個通道表示,所有的NIO的IO操作都是從通道開始的。一個通道類似於OIO中的兩個流的結合體,既可以從通道讀取,也可以向通道寫入。

2、Selector選擇器

  1. 什麼是IO多路複用?指的是一個進程/線程可以同時監視多個文件描述符(一個網絡連接,操作系統底層使用一個文件描述符來表示),一旦其中的一個或者多個文件描述符可讀或者可寫,系統內核就通知該進程/線程。
  1. 選擇器的功能是什麼呢?它一個IO事件的查詢器。通過選擇器,一個線程可以查詢多個通道的IO事件的就緒狀態。實現IO多路複用,從具體的開發層面來說,首先把通道註冊到選擇器中,然後通過選擇器內部的機制,可以查詢(select)這些註冊的通道是否有已經就緒的IO事件(例如可讀、可寫、網絡連接完成等)。
  1. 一個選擇器只需要一個線程進行監控,簡單地使用一個線程,通過選擇器去管理多個通道。這是非常高效的,這種高效來自於Java的選擇器組件Selector,以及其背後的操作系統底層的IO多路複用的支持。
  1. 與OIO相比,使用選擇器的最大優勢:系統開銷小,系統不必爲每一個網絡連接(文件描述符)創建進程/線程,從而大大減小了系統的開銷。

3、緩衝區(Buffer)應用程序與通道(Channel)主要的交互操作,就是進行數據的read讀取和write寫入。

  1. 通道的讀取,就是將數據從通道讀取到緩衝區中;
  1. 通道的寫入,就是將數據從緩衝區中寫入到通道中。
  1. 緩衝區的使用,是面向流的OIO所沒有的,也是NIO非阻塞的重要前提和基礎之一。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章