IO、NIO、BIO、AIO的區別

IO和NIO的區別:其本質就是阻塞和非阻塞的區別。

阻塞概念:應用程序在獲取網絡數據的時候,如果網絡傳輸數據很慢,那麼久一直等着,知道傳輸完畢爲止。
非阻塞概念:應用程序直接可以獲取已經準備就緒好的數據,無需等待。(從操作系統緩衝區中直接讀取已經緩衝完畢的數據,不用阻塞等待數據緩衝完畢,可以在這段時間中做其他事)。

同步和異步的區別:

同步:應用程序會直接參與IO讀寫操作哦,並且應用程序會直接阻塞到某個方法上,知道數據準備就緒;或者採用輪詢的策略實時檢查數據的就緒狀態,如果就緒則獲取數據。
異步:所有的IO讀寫交給操作系統處理,於應用程序沒有直接關係,程序不需要關心IO讀寫,當操作系統完成了IO讀寫時,會給應用程序發送通知,應用程序直接拿走數據即可。

同步說的是server服務端的執行方式(面向操作系統,異步:操作系統已經完成加載的過程)
阻塞說的是具體技術,接收數據的方式、狀態(io、nio)

傳統的IO特點
它的各種流是阻塞的。
單線程的情況下,只能存在一個客戶端。以爲檔一個線程調用讀寫的方法的時候,會被阻塞,直到有一些數據被讀取或者數據被完全寫入。它是面向流的。每次是從流中讀取一個後者多個字節,直到所有的字節被讀完。沒有緩衝區,不能前後移動流中的數據。serverSocket和socket都是阻塞式的,因此一旦有大規模的併發行爲,而每一個訪問都會開啓一個新線程。

版權聲明:本文爲CSDN博主「YanZhenRui」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。

2:NIO
NIO中沒有數據可讀時,read()會立即返回0,線程不會阻塞。
在這裏插入圖片描述
多路複用器(seletor),他是NIO編程的基礎,非常重要,多路複用器提供選擇已經就緒的任務的能力。

簡單說,就是Selector會不斷地輪詢註冊在其上的通道(Channel),如果某個通道發生了讀寫操作,這個通道就處於就緒狀態,會被Selector輪詢出來,然後通過SelectionKey可以取得就緒的Channel集合,從而進行後續的IO操作。

版權聲明:本文爲CSDN博主「小馬的學習筆記」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。

是爲了彌補IO的不足而誕生的,性特性爲:非阻塞I/O,選擇器,緩衝以及管道。管道(Channel),緩衝(Buffer) ,選擇器( Selector)是其主要特徵:

buffer:因爲NIO是基於緩衝的,所以buffer是最底層的必要類,這也是IO和NIO的根本不同,雖然stream等有buffer開頭的擴展類,但只是流的包裝類,還是從流讀到緩衝區,而NIO卻是直接讀到buffer中進行操作。

channel:類似於IO的stream,但是不同的是除了FileChannel,其他的channel都能以非阻塞狀態運行。FileChannel執行的是文件的操作,可以直接DMA操作內存而不依賴於CPU。其他比如socketchannel就可以在數據準備好時才進行調用。

selector:用於分發請求到不同的channel,這樣才能確保channel不處於阻塞狀態就可以收發消息。
BIO
在這裏插入圖片描述

AIO
在NIO基礎上引入了異步通道的概念,並提供了異步文件異步套接字通道的實現。AIO不需要通過多路複用器對註冊的通道進行輪詢操作即可實現異步讀寫,從而簡化了NIO變成模型。

select,pselect,poll,epoll本質上都是同步I/O,因爲他們都需要在讀寫事件就緒後自己負責進行讀寫,也就是說這個讀寫過程是阻塞的,而異步I/O則無需自己負責進行讀寫,異步I/O的實現會負責把數據從內核拷貝到用戶空間。

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