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

Java?IO模型之BIO、NIO、AIO三種常見(jiàn)IO模型解析

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

一、寫(xiě)在開(kāi)頭

很久沒(méi)更新嘍,最近build哥一直在忙著工作,忙著寫(xiě)小說(shuō),都忘記學(xué)習(xí)自己的本職了,哈哈,不過(guò)現(xiàn)在正式回歸!
我們繼續(xù)學(xué)習(xí)Java的IO相關(guān)內(nèi)容,之前我們了解到,所謂的IO(Input/Output)就是計(jì)算機(jī)系統(tǒng)與外部設(shè)備之間通信的過(guò)程。

二、IO調(diào)用過(guò)程

接下來(lái)我們從應(yīng)用調(diào)用的過(guò)程中來(lái)分析一下整個(gè)IO的執(zhí)行過(guò)程。不過(guò)在此之前,我們需要簡(jiǎn)單的了解一下整個(gè)操作系統(tǒng)的空間布局。為了保證操作系統(tǒng)的穩(wěn)定性和安全性,一個(gè)進(jìn)程的地址空間劃分為用戶(hù)空間(User space) 和 內(nèi)核空間(Kernel space ) 。

內(nèi)核空間: 是操作系統(tǒng)內(nèi)核所使用的空間,用來(lái)存儲(chǔ)底層內(nèi)核代碼、數(shù)據(jù)結(jié)構(gòu)以及內(nèi)核級(jí)別的系統(tǒng)調(diào)用。內(nèi)核空間擁有比較高的權(quán)限,比如文件管理、進(jìn)程通信、內(nèi)存管理等等。
用戶(hù)空間: 用戶(hù)級(jí)別的應(yīng)用程序和服務(wù)分配的內(nèi)存區(qū)域。它包含了應(yīng)用程序的代碼、數(shù)據(jù)和運(yùn)行時(shí)堆棧。用戶(hù)空間與內(nèi)核空間相對(duì)隔離,具有較低的權(quán)限級(jí)別,不能直接訪(fǎng)問(wèn)內(nèi)核空間或硬件資源。

image

所以說(shuō),我們想要進(jìn)行 IO 操作,一定是要依賴(lài)內(nèi)核空間的能力。平常開(kāi)發(fā)過(guò)程中接觸最多的就是磁盤(pán) IO(讀寫(xiě)文件) 和 網(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)核空間拷貝到用戶(hù)空間;IO輸出給應(yīng)用程序。

三、IO常用模型

在UNIX系統(tǒng)中,我們所提到的IO模型一般是這四種:同步阻塞 I/O、同步非阻塞 I/O、I/O 多路復(fù)用、信號(hào)驅(qū)動(dòng) I/O 和異步 I/O。

不過(guò),在日常使用中,我們常用的多為 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)求后,處理線(xiàn)程處于阻塞狀態(tài),直到請(qǐng)求的IO數(shù)據(jù)從內(nèi)核空間拷貝到用戶(hù)空間。如下圖可以直觀的體現(xiàn)整個(gè)流程(圖源:沉默王二)。

image

如果發(fā)起IO的應(yīng)用程序并發(fā)量不高的情況下,這種模型是沒(méi)問(wèn)題的。但很明顯,當(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 操作,允許線(xiàn)程在等待 IO 時(shí)執(zhí)行其他任務(wù)。常見(jiàn)的 NIO 類(lèi)有 ByteBuffer、FileChannel、SocketChannel、ServerSocketChannel 等。(圖源:深入拆解Tomcat & Jetty)

image

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

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

在同步非阻塞IO模型下,需要通過(guò)不斷的輪詢(xún)?nèi)z查請(qǐng)求數(shù)據(jù)是否已經(jīng)完成,這個(gè)過(guò)程是很耗CPU的。因此,便又誕生了I/O多路復(fù)用模型。

I/O 多路復(fù)用模型:使用操作系統(tǒng)提供的多路復(fù)用功能(如 select、poll、epoll 等),使得單個(gè)線(xiàn)程可以同時(shí)處理多個(gè) I/O 事件。當(dāng)某個(gè)連接上的數(shù)據(jù)準(zhǔn)備好時(shí),操作系統(tǒng)會(huì)通知應(yīng)用程序。這樣,應(yīng)用程序可以在一個(gè)線(xiàn)程中處理多個(gè)并發(fā)連接,而不需要為每個(gè)連接創(chuàng)建一個(gè)線(xiàn)程。(圖源:沉默王二)

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)的線(xiàn)程進(jìn)行后續(xù)的操作。

image

總結(jié)

以上BIO、NIO、AIO三種常見(jiàn)的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ù)傳輸過(guò)程,完成后通知應(yīng)用程序。應(yīng)用程序無(wú)需等待數(shù)據(jù)傳輸,可執(zhí)行其他任務(wù)。

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

相關(guān)文章

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

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

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

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

    這篇文章主要介紹了SpringCloud zuul網(wǎng)關(guān)解決跨域問(wèn)題的具體實(shí)現(xiàn)方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(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ù)、鏈表的實(shí)現(xiàn)的集合Set復(fù)雜度分析實(shí)例詳解

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

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

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

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

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

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

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

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

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

    JAVA中類(lèi)不直接支持多繼承,因?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à)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • spring-mybatis與原生mybatis使用對(duì)比分析

    spring-mybatis與原生mybatis使用對(duì)比分析

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

最新評(píng)論

蚌埠市| 永新县| 芦溪县| 福泉市| 宝应县| 屏山县| 农安县| 上杭县| 舒城县| 萨嘎县| 宁明县| 南涧| 金堂县| 宁阳县| 吉木萨尔县| 时尚| 句容市| 邹平县| 邯郸市| 昌黎县| 莱阳市| 安达市| 鹤峰县| 通山县| 鸡西市| 库伦旗| 鄂尔多斯市| 乐平市| 都兰县| 分宜县| 磐安县| 霍林郭勒市| 英超| 许昌市| 基隆市| 商水县| 广饶县| 长武县| 泽普县| 琼中| 阿坝县|