Java NIOAIO瞭解

一、阻塞和非阻塞

阻塞和非阻塞是進程在訪問數據的時候,數據內是否準備就緒的一種處理方式,當數據沒有準備的時候。

阻塞:往往需要等到緩衝區中的數據準備好過後才處理其他的事情,否則一直等待在那裏。

非阻塞:當我們的進程訪問我們的數據緩衝區的時候,數據沒有準備好的時候,直接返回,不需要等待數據。數據有的時候,也直接返回。

二、同步和異步

同步和異步都是基於應用程序和操作系統處理IO時間所採用的方式,比如同步應用程序要直接參與IO讀寫的操作,異步所有的IO讀寫交給操作系統處理。

同步的方式處理IO事件的時候,必須阻塞在某個方法上面等待我們的IO事件完成(阻塞IO事件或者通過輪詢的),對於異步來說,所有的IO讀寫都交給了操作系統,這個時候,我們可以去做其他的事情,並不需要去完成真正的IO操作。當操作系統完成IO後,給我們的應用程序一個通知就可以了。

同步:
1. 阻塞到IO事件
阻塞到 read 或者 write,這個時候我們就完全不能做自己的事情。讓讀寫方法加入到線程裏面,然後阻塞線程的方式來實現。對線程的性能開銷比較大。
2. IO事件的輪詢(多路複用技術 select模型)
讀寫事件交給一個單獨的線程來處理,這個線程完成IO事件的註冊功能,還有不斷地去輪詢我們的讀寫緩衝區,看是否有數據準備好。通知我們相應的讀寫線程。這樣的話,以前的讀寫線程就可以做其他的事情,這個時候阻塞的不是所有的IO線程,阻塞的 select 這個線程。

三、Java IO模型

  1. BIO JDK1.4 以前我們使用的都是BIO(阻塞IO),阻塞我們的讀寫方法到線程來提高性能。對於線程的開銷本來就是一種性能的浪費。
  2. NIO JDK1.4 Linux 多路複用技術(select模型)實現IO事件的輪詢方式來實現的同步非阻塞的模式。這種方式目前是主流的網絡通信模式。Mina,Netty等網絡通信框架比我們直接寫NIO要容易些,並且代碼可讀性更好。
  3. AIO JDK1.7(NIO2) 真正的異步非阻塞IO,學習Linux epoll 模式。AIO使用得比較少,可以學習其思想。

四、NIO AIO原理的解讀

對於網絡通信而言NIO AIO並沒有改變網絡通信的基本步驟,只是在原來的基礎上(serversocket,socket)做了一個改進。

Socket <——-建立連接需要三次握手——> serversocket

對於三次握手的方式建立穩定的連接,性能開銷比較大。解決方案從思想上來說比較容易,就是減少連接的次數,對我們的讀寫通信管進行一個抽象。Channel是在一個TCP連接之間的抽象,一個TCP連接可以對應多個管道,而不是以前只有一個通信信道,減少了TCP連接的次數

五、NIO 原理

通過select(選擇器)就相當於管家,管理所有的IO事件(connection、accept、客戶端和服務端的讀寫)。

六、select如何進行管理IO事件?

當IO事件註冊給我們的選擇器的時候,選擇器會給他們分配一個key(可以簡單地理解成一個事件的標籤)。當IO事件完成後通過key值來找到相應的管道,然後通過管道發送數據和接收數據等操作。
* 數據緩衝區 通過bytebuffer,提供很多讀寫的方法put、get。
* 服務端 ServerSocketChannel
* 客戶端 SocketChannel
* 選擇器 Selector selector = select.open();這樣就打開了我們的選擇器。

七、Selectionkey 以通過它來判斷IO事件是否已經就緒。

key.isAcceptable 是否可以接受客戶端的連接
key.isConnectionable 是否可以連接服務端
key.isReadable 緩衝區是否可讀
key.isWritable 緩衝區是否可寫

八、如何獲得事件keys

Selectionkey keys = selector.selectedKeys();

九、如何註冊

channel.regist(Selector, selectionkey.OP_Wirte);
channel.regist(Selector, selectionkey.OP_Read);
channel.regist(Selector, selectionkey.OP_Connect);
channel.regist(Selector, selectionkey.OP_Accept);

十、AIO主要API

  • 服務端 AsynchronousServerSocketChannel
  • 客戶端 AsynchronousSocketChannel
  • 用戶處理器 CompletionHandler接口,這個接口實現應用程序向操作系統發起IO請求,當完成後處理具體邏輯,否則,做自己該做的事情。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章