JAVA “NIO”之我解

關於JAVA "NIO" 相關資料網上太多,如果你在網上一搜結果裏一般就會說什麼bio是一個線程處理一個tcp連接,什麼調用read就阻塞直到有內容,而nio是通過單線程輪詢方式,不會產生線程阻塞;然後就貼出一堆關於Socket ServerSocket,SocketChannel ServerSocketChannel的代碼,讓人感到疑惑到底什麼是NIO

其實看到這些概念我是懵逼(上面說的都沒有錯,只不過這些都不是我想要了解的層次)

在最開始我沒有明白NIO到底是JAVA獨有的東西還是其他語言普遍存在的一個概念?它到底是操作系統支持的?還是通過api設計而達到的某種特性?

它到底是一個什麼東西?

通過 

https://blog.csdn.net/qq_34638435/article/details/81878301

https://www.cnblogs.com/binarylei/p/8933516.html#同步非阻塞-io-nonblocking-io

 解開了我部分疑惑;NIO是一種網絡IO模型,Linux中提出來的(windows中是否實現?如何實現?)

自然而然一上來就是各種socket代碼了(JAVA中也提供了文件相關的Channel)。

Java裏的NIO是New Input/Output的簡稱,提供了各種輸入輸出相關的api,包括文件IO、網絡IO(多路複用IO模型的實現:ServerSocketChannel相關api,AIO模型的實現:AsynchronousSocketChannel相關api)等;

 

以下是我對同步 異步,阻塞 非阻塞的理解

同步:調用內核api後線程主動阻塞,直到內核api返回結果

異步:調用內核api後線程不阻塞,可繼續做其他事情

阻塞:內核接收到調用後,依次完成

                   1、從網絡中獲取到數據

                   2、將數據從內核內存拷貝到應用內存過程後返回返回值

非阻塞:內核收到調用後,根據實際情況返回返回值(有數據就返回數據,沒有數據也返回一個標記)

 

通過下面這張圖可以比較清晰的看出JAVA api和操作系統(以linux爲例)是如何配合來實現多路複用IO的

(JAVA端:客戶端發送的連接請求都會註冊到多路複用器上,多路複用器輪詢到連接有I/O請求時才啓動一個線程進行處理)

 

附:網絡IO模型比較

over

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章