Java?IO模型之BIO、NIO、AIO三種常見IO模型解析
一、寫在開頭
很久沒更新嘍,最近build哥一直在忙著工作,忙著寫小說,都忘記學(xué)習(xí)自己的本職了,哈哈,不過現(xiàn)在正式回歸!
我們繼續(xù)學(xué)習(xí)Java的IO相關(guān)內(nèi)容,之前我們了解到,所謂的IO(Input/Output)就是計(jì)算機(jī)系統(tǒng)與外部設(shè)備之間通信的過程。
二、IO調(diào)用過程
接下來我們從應(yīng)用調(diào)用的過程中來分析一下整個(gè)IO的執(zhí)行過程。不過在此之前,我們需要簡(jiǎn)單的了解一下整個(gè)操作系統(tǒng)的空間布局。為了保證操作系統(tǒng)的穩(wěn)定性和安全性,一個(gè)進(jìn)程的地址空間劃分為用戶空間(User space) 和 內(nèi)核空間(Kernel space ) 。
內(nèi)核空間: 是操作系統(tǒng)內(nèi)核所使用的空間,用來存儲(chǔ)底層內(nèi)核代碼、數(shù)據(jù)結(jié)構(gòu)以及內(nèi)核級(jí)別的系統(tǒng)調(diào)用。內(nèi)核空間擁有比較高的權(quán)限,比如文件管理、進(jìn)程通信、內(nèi)存管理等等。
用戶空間: 用戶級(jí)別的應(yīng)用程序和服務(wù)分配的內(nèi)存區(qū)域。它包含了應(yīng)用程序的代碼、數(shù)據(jù)和運(yùn)行時(shí)堆棧。用戶空間與內(nèi)核空間相對(duì)隔離,具有較低的權(quán)限級(jí)別,不能直接訪問內(nèi)核空間或硬件資源。
所以說,我們想要進(jìn)行 IO 操作,一定是要依賴內(nèi)核空間的能力。平常開發(fā)過程中接觸最多的就是磁盤 IO(讀寫文件) 和 網(wǎng)絡(luò) IO(網(wǎng)絡(luò)請(qǐng)求和響應(yīng))。
執(zhí)行步驟:
應(yīng)用程序發(fā)起IO請(qǐng)求;系統(tǒng)內(nèi)核接受到系統(tǒng)調(diào)用請(qǐng)求;內(nèi)核等待數(shù)據(jù)準(zhǔn)備;內(nèi)核將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間;IO輸出給應(yīng)用程序。
三、IO常用模型
在UNIX系統(tǒng)中,我們所提到的IO模型一般是這四種:同步阻塞 I/O、同步非阻塞 I/O、I/O 多路復(fù)用、信號(hào)驅(qū)動(dòng) I/O 和異步 I/O。
不過,在日常使用中,我們常用的多為 BIO(Blocking I/O)
:同步阻塞 IO 模型、NIO (Non-blocking/New I/O)
:同步非阻塞 IO 模型、AIO (Asynchronous I/O)
:異步 IO 模型。
3.1 BIO (Blocking I/O)
在傳統(tǒng)的IO中,多以這種同步阻塞的IO模型為主,這種模型下,程序發(fā)起IO請(qǐng)求后,處理線程處于阻塞狀態(tài),直到請(qǐng)求的IO數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間。如下圖可以直觀的體現(xiàn)整個(gè)流程(圖源:沉默王二)。
如果發(fā)起IO的應(yīng)用程序并發(fā)量不高的情況下,這種模型是沒問題的。但很明顯,當(dāng)前的互聯(lián)網(wǎng)中,很多應(yīng)用都有高并發(fā)IO請(qǐng)求的情況,這時(shí)就迫切的需要一款高效的IO模型啦。
3.2 NIO (Non-blocking/New I/O)
這種NIO模型,這個(gè)N既可以命名為NEW代表一種新型的IO模型,又可以理解為Non-Blocking,非阻塞之意。
Java NIO 是 Java 1.4 版本引入的,基于通道(Channel)和緩沖區(qū)(Buffer)進(jìn)行操作,采用非阻塞式 IO 操作,允許線程在等待 IO 時(shí)執(zhí)行其他任務(wù)。常見的 NIO 類有 ByteBuffer、FileChannel、SocketChannel、ServerSocketChannel 等。(圖源:深入拆解Tomcat & Jetty)
雖然在應(yīng)用發(fā)起IO請(qǐng)求時(shí),之多多次發(fā)起,無(wú)須阻塞。但在內(nèi)核將數(shù)據(jù)拷貝到用戶空間時(shí),還是會(huì)阻塞的,為了保證數(shù)據(jù)的準(zhǔn)確性和系統(tǒng)的安全穩(wěn)定。
3.3 I/O 多路復(fù)用模型
在同步非阻塞IO模型下,需要通過不斷的輪詢?nèi)z查請(qǐng)求數(shù)據(jù)是否已經(jīng)完成,這個(gè)過程是很耗CPU的。因此,便又誕生了I/O多路復(fù)用模型。
I/O 多路復(fù)用模型:使用操作系統(tǒng)提供的多路復(fù)用功能(如 select、poll、epoll 等),使得單個(gè)線程可以同時(shí)處理多個(gè) I/O 事件。當(dāng)某個(gè)連接上的數(shù)據(jù)準(zhǔn)備好時(shí),操作系統(tǒng)會(huì)通知應(yīng)用程序。這樣,應(yīng)用程序可以在一個(gè)線程中處理多個(gè)并發(fā)連接,而不需要為每個(gè)連接創(chuàng)建一個(gè)線程。(圖源:沉默王二)
3.4 AIO (Asynchronous I/O)
AIO 也就是 NIO 2。Java 7 中引入了 NIO 的改進(jìn)版 NIO 2,它是異步 IO 模型。異步 IO 是基于事件和回調(diào)機(jī)制實(shí)現(xiàn)的,也就是應(yīng)用操作之后會(huì)直接返回,不會(huì)堵塞在那里,當(dāng)后臺(tái)處理完成,操作系統(tǒng)會(huì)通知相應(yīng)的線程進(jìn)行后續(xù)的操作。
總結(jié)
以上BIO、NIO、AIO三種常見的IO模型是Java面試中最??嫉?,大家一定要記住其各自的特點(diǎn)和作用。
阻塞 I/O:應(yīng)用程序執(zhí)行 I/O 操作時(shí),會(huì)一直等待數(shù)據(jù)傳輸完成,期間無(wú)法執(zhí)行其他任務(wù)。非阻塞 I/O:應(yīng)用程序執(zhí)行 I/O 操作時(shí),如果數(shù)據(jù)未準(zhǔn)備好,立即返回錯(cuò)誤狀態(tài),不等待數(shù)據(jù)傳輸完成,可執(zhí)行其他任務(wù)。異步 I/O:應(yīng)用程序發(fā)起 I/O 操作后,內(nèi)核負(fù)責(zé)數(shù)據(jù)傳輸過程,完成后通知應(yīng)用程序。應(yīng)用程序無(wú)需等待數(shù)據(jù)傳輸,可執(zhí)行其他任務(wù)。
到此這篇關(guān)于今天我們來聊Java IO模型,BIO、NIO、AIO三種常見IO模型的文章就介紹到這了,更多相關(guān)Java IO模型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis學(xué)習(xí)教程(六)-調(diào)用存儲(chǔ)過程
這篇文章主要介紹了MyBatis學(xué)習(xí)教程(六)-調(diào)用存儲(chǔ)過程的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧2016-05-05Java數(shù)據(jù)結(jié)構(gòu)之雙端鏈表原理與實(shí)現(xiàn)方法
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之雙端鏈表原理與實(shí)現(xiàn)方法,簡(jiǎn)單描述了雙端鏈表的概念、原理并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)雙端鏈表的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10springboot整合netty實(shí)現(xiàn)心跳檢測(cè)和自動(dòng)重連
本文主要介紹了Spring Boot中整合Netty實(shí)現(xiàn)心跳檢測(cè)和自動(dòng)重連,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11java隨機(jī)數(shù)生產(chǎn)算法實(shí)例
下面小編就為大家?guī)硪黄猨ava隨機(jī)數(shù)生產(chǎn)算法實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10java基礎(chǔ)之 Arrays.toString()方法詳解
這篇文章主要介紹了java基礎(chǔ)之 Arrays.toString()方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02IDEA插件之mybatisx插件使用教程(超詳細(xì)!)
MybatisX 是一款基于IDEA的快速開發(fā)插件,為效率而生,下面這篇文章主要給大家介紹了關(guān)于IDEA插件之mybatisx插件使用的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06Java工具類BeanUtils庫(kù)介紹及實(shí)例詳解
這篇文章主要介紹了Java工具類BeanUtils庫(kù)介紹及實(shí)例詳解,需要的朋友可以參考下2020-02-02