最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?IO模型之BIO、NIO、AIO三種常見IO模型解析

 更新時(shí)間:2024年07月15日 08:59:55   作者:JavaBuild  
這篇文章主要介紹了今天我們來聊Java?IO模型,BIO、NIO、AIO三種常見IO模型,我們從應(yīng)用調(diào)用的過程中來分析一下整個(gè)IO的執(zhí)行過程,不過在此之前,我們需要簡單的了解一下整個(gè)操作系統(tǒng)的空間布局,需要的朋友可以參考下

一、寫在開頭

很久沒更新嘍,最近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í)行過程。不過在此之前,我們需要簡單的了解一下整個(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)核級別的系統(tǒng)調(diào)用。內(nèi)核空間擁有比較高的權(quán)限,比如文件管理、進(jìn)程通信、內(nèi)存管理等等。
用戶空間: 用戶級別的應(yīng)用程序和服務(wù)分配的內(nèi)存區(qū)域。它包含了應(yīng)用程序的代碼、數(shù)據(jù)和運(yùn)行時(shí)堆棧。用戶空間與內(nèi)核空間相對隔離,具有較低的權(quán)限級別,不能直接訪問內(nèi)核空間或硬件資源。

image

所以說,我們想要進(jìn)行 IO 操作,一定是要依賴內(nèi)核空間的能力。平常開發(fā)過程中接觸最多的就是磁盤 IO(讀寫文件) 和 網(wǎng)絡(luò) IO(網(wǎng)絡(luò)請求和響應(yīng))。

執(zhí)行步驟:

應(yīng)用程序發(fā)起IO請求;系統(tǒng)內(nèi)核接受到系統(tǒng)調(diào)用請求;內(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ù)用、信號驅(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請求后,處理線程處于阻塞狀態(tài),直到請求的IO數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間。如下圖可以直觀的體現(xiàn)整個(gè)流程(圖源:沉默王二)。

image

如果發(fā)起IO的應(yīng)用程序并發(fā)量不高的情況下,這種模型是沒問題的。但很明顯,當(dāng)前的互聯(lián)網(wǎng)中,很多應(yīng)用都有高并發(fā)IO請求的情況,這時(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)

image

雖然在應(yīng)用發(fā)起IO請求時(shí),之多多次發(fā)起,無須阻塞。但在內(nèi)核將數(shù)據(jù)拷貝到用戶空間時(shí),還是會(huì)阻塞的,為了保證數(shù)據(jù)的準(zhǔn)確性和系統(tǒng)的安全穩(wěn)定。

3.3 I/O 多路復(fù)用模型

在同步非阻塞IO模型下,需要通過不斷的輪詢?nèi)z查請求數(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è)線程。(圖源:沉默王二)

image

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ù)的操作。

image

總結(jié)

以上BIO、NIO、AIO三種常見的IO模型是Java面試中最??嫉模蠹乙欢ㄒ涀∑涓髯缘奶攸c(diǎn)和作用。

阻塞 I/O:應(yīng)用程序執(zhí)行 I/O 操作時(shí),會(huì)一直等待數(shù)據(jù)傳輸完成,期間無法執(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)用程序無需等待數(shù)據(jù)傳輸,可執(zhí)行其他任務(wù)。

到此這篇關(guān)于今天我們來聊Java IO模型,BIO、NIO、AIO三種常見IO模型的文章就介紹到這了,更多相關(guān)Java IO模型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java使用顏色選擇器示例分享

    java使用顏色選擇器示例分享

    這篇文章主要介紹了java使用顏色選擇器示例,需要的朋友可以參考下
    2014-03-03
  • SpringCloud zuul 網(wǎng)關(guān)如何解決跨域問題

    SpringCloud zuul 網(wǎng)關(guān)如何解決跨域問題

    這篇文章主要介紹了SpringCloud zuul網(wǎng)關(guān)解決跨域問題的具體實(shí)現(xiàn)方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot集成WebSokcet代碼步驟

    SpringBoot集成WebSokcet代碼步驟

    Spring?Boot是一個(gè)流行的Java框架,用于快速構(gòu)建Spring應(yīng)用程序,WebSocket是一種實(shí)現(xiàn)實(shí)時(shí)通信的協(xié)議,與HTTP協(xié)議結(jié)合使用,可以提供全雙工通信,這篇文章主要介紹了SpringBoot集成WebSokcet代碼步驟
    2026-01-01
  • Java基于二分搜索樹、鏈表的實(shí)現(xiàn)的集合Set復(fù)雜度分析實(shí)例詳解

    Java基于二分搜索樹、鏈表的實(shí)現(xiàn)的集合Set復(fù)雜度分析實(shí)例詳解

    這篇文章主要介紹了Java基于二分搜索樹、鏈表的實(shí)現(xiàn)的集合Set復(fù)雜度分析,結(jié)合實(shí)例形式詳細(xì)分析了Java基于二分搜索樹、鏈表的實(shí)現(xiàn)的集合Set復(fù)雜度分析相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • 微信公眾號支付(二)實(shí)現(xiàn)統(tǒng)一下單接口

    微信公眾號支付(二)實(shí)現(xiàn)統(tǒng)一下單接口

    本篇文章主要給大家介紹調(diào)用微信公眾支付的統(tǒng)一下單API,通過參數(shù)封裝為xml格式并發(fā)送到微信給的接口地址就可以獲得返回內(nèi)容,需要的朋友可以參考下本文
    2015-09-09
  • Java中覆蓋finalize()方法實(shí)例代碼

    Java中覆蓋finalize()方法實(shí)例代碼

    這篇文章主要介紹了Java中覆蓋finalize()方法實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • springboot2中設(shè)置@ApiImplicitParam的dataType不起作用的解決

    springboot2中設(shè)置@ApiImplicitParam的dataType不起作用的解決

    本文主要介紹了在SpringBoot2中使用Swagger時(shí),@ApiImplicitParam的dataType屬性不起作用的問題及其解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • 原來Java接口多實(shí)現(xiàn)還可以這樣玩

    原來Java接口多實(shí)現(xiàn)還可以這樣玩

    JAVA中類不直接支持多繼承,因?yàn)闀?huì)出現(xiàn)調(diào)用的不確定性,所以JAVA將多繼承機(jī)制進(jìn)行改良,在JAVA中變成了多實(shí)現(xiàn),這篇文章主要給大家介紹了關(guān)于Java接口多實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 淺談MyBatis中@MapKey的妙用

    淺談MyBatis中@MapKey的妙用

    這篇文章主要介紹了MyBatis中@MapKey的妙用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • spring-mybatis與原生mybatis使用對比分析

    spring-mybatis與原生mybatis使用對比分析

    這篇文章主要介紹了spring-mybatis與原生mybatis使用對比分析,需要的朋友可以參考下
    2017-11-11

最新評論

泰安市| 博野县| 武功县| 民权县| 射阳县| 迁西县| 宜川县| 绥江县| 内黄县| 吉首市| 大厂| 乐东| 垦利县| 兴和县| 资中县| 襄垣县| 武平县| 凤台县| 韩城市| 新晃| 滨海县| 中山市| 金沙县| 肇东市| 高安市| 西华县| 缙云县| 三台县| 嘉黎县| 布尔津县| 鄯善县| 滦平县| 乌什县| 沅江市| 安阳市| 拜泉县| 阜平县| 建水县| 昭觉县| 长垣县| 灵台县|