Java網絡編程基礎(Netty預備知識)


今天在家休息,閑來無事,寫篇博客,陶冶下情操~~~

=================我是分割線================

最近在重新學習Java網絡編程基礎,以便后續進行Netty的學習。

整理了一下重要的基礎知識點,供大家參考。

正在讀這篇隨筆的你是否遇到過如下問題?

什么是BIO?什么是NIO?什么是AIO?什么是同步IO?什么是異步IO?什么是阻塞IO?什么是非阻塞IO?

為什么我感覺異步IO和非阻塞IO是一樣的?

讀完這篇隨筆后相信大家就會明白了。

廢話不多時,直接上干貨。

一、阻塞IO和非阻塞IO、同步IO和異步IO

阻塞,通俗的說就是在干一件事情的時候不能干其他事情,直到當前正在干的事情完成為止。

一個IO操作其實分成了兩個步驟:發起IO請求和實際的IO操作。
同步IO和異步IO的區別就在於第二個步驟是否阻塞,如果實際的IO讀寫阻塞請求進程,那么就是同步IO;如果不阻塞,而是操作系統幫你做完IO操作再將結果返回給你,那么就是異步IO。
阻塞IO和非阻塞IO的區別在於第一步,發起IO請求是否會被阻塞,如果阻塞直到完成那么就是傳統的阻塞IO,如果不阻塞,那么就是非阻塞IO。

也就是說發起IO請求之后不能再去發起別的請求,那就是阻塞,否則是非阻塞。

如果實際IO操作的時候進程不能進行其他實際操作,那就是同步;否則是異步(因為是OS在實際進行IO操作,OS操作的時候,進程還可以做其他事情)。

所以異步和非阻塞看上去都是在做一件事情的時候還能做別的事情,好像是一樣的,但是卻對應於IO操作的兩個不同步驟。

另外,同步和異步說的是進程和進程(OS)之間;而阻塞和非阻塞說的是進程內部。

我們來舉個通俗的例子:

你想吃金拱門了:
1.你點了份漢堡,然后在收銀台前等着,還不停的問收銀妹子“好了沒啊,餓死了”-----同步阻塞
2.你點了份漢堡,然后找個位置坐下打起了王者農葯,然后隔一會兒去問下收銀妹子“好了沒啊,餓死了”-----同步非阻塞
3.打王者農葯的時候,收銀台的妹子說漢堡好了,讓你自己過去取-----異步阻塞
4.漢堡好了之后,收銀台的妹子把做好的漢堡端給你-----異步非阻塞

IO操作可以分為3類:同步阻塞(即早期的IO操作)、同步非阻塞(NIO)、異步(AIO)。 

同步阻塞: 
在此種方式下,用戶進程在發起一個IO操作以后,必須等待IO操作的完成,只有當真正完成了IO操作以后,用戶進程才能運行。JAVA傳統的IO模型屬於此種方式。 
同步非阻塞: 
在此種方式下,用戶進程發起一個IO操作以后便可返回做其它事情,但是用戶進程需要時不時的詢問IO操作是否就緒,這就要求用戶進程不停的去詢問,從而引入不必要的CPU資源浪費。其中目前JAVA的NIO就屬於同步非阻塞IO。 
異步: 
此種方式下是指應用發起一個IO操作以后,不等待內核IO操作的完成,等內核完成IO操作以后會通知應用程序。”

----------以上內容參考了https://blog.csdn.net/u013851082/article/details/53942947

二、BIO、NIO、AIO

理解了同步和異步、阻塞和非阻塞之后我們來分別看下java的各種IO:

1.BIO(同步阻塞IO)

JDK1.4之前使用的IO操作,客戶端通過Socket來實現,服務器端通過ServerSocket來實現;客戶端和服務器通過一條inputStream和一個outputStream進行通信

從上圖中可以看出每個客戶端和服務器之間都會存在兩條流,一個輸入流一個輸出流(圖中是相對於客戶端來說的,客戶端的輸入流就是服務器的輸入流,客戶端的輸出流就是服務器的輸入流)。

另外,服務器在和客戶端1通信的時候不能同時和客戶端2進行通信。

2.NIO(同步非阻塞IO)

JDK1.4之后開始使用NIO

NIO引入了三個概念:Selector(選擇器,也叫多路復用器)、Buffer(緩沖區)、Channel(雙向通道)。

Java NIO采用了channel進行數據傳輸,而不是單向的流(stream),channel中的數據是先寫入緩沖然后處理,同樣數據的讀取也是到緩沖區里面去讀。

在通道上可以注冊我們感興趣的事件。一共有以下四種事件:

服務端接收客戶端連接事件 SelectionKey.OP_ACCEPT(16) 
客戶端連接服務端事件 SelectionKey.OP_CONNECT(8)
讀事件 SelectionKey.OP_READ(1)
寫事件 SelectionKey.OP_WRITE(4)

服務端和客戶端各自維護一個管理通道的對象,我們稱之為selector,該對象能檢測一個或多個通道 (channel) 上的事件。

selector用來輪詢所有channel,用來發現就緒的channel。

 

 

3.AIO(異步IO)

 JDK 1.7中開始引入AIO,也就是NIO 2.0。AIO引入新的異步通道的概念,並提供了異步文件通道和異步套接字通道的實現。

 

三、三種I/O的對比:

網上看到一張圖,分享一下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM