今天在家休息,閑來無事,寫篇博客,陶冶下情操~~~
=================我是分割線================
最近在重新學習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的對比:
在網上看到一張圖,分享一下