亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一文讓你了解透徹Java中的IO模型

 更新時(shí)間:2023年05月04日 08:37:03   作者:小小小小明明明明明明明明  
本文只是說(shuō)明了IO模型,讓你了解IO模型是什么,怎么區(qū)分IO模型,以及分析了Java中的三種IO模型,本文是純理論知識(shí),看完之后會(huì)讓你對(duì)IO有更加深刻的理解,感興趣的同學(xué)可以參考一下

什么是IO

IO(Input/Output),也就是輸入和輸出的簡(jiǎn)稱(chēng),從計(jì)算機(jī)結(jié)構(gòu)的角度來(lái)看,IO,就是輸入數(shù)據(jù)到計(jì)算機(jī)中,計(jì)算機(jī)輸出數(shù)據(jù)到計(jì)算機(jī)外,下面有一張十分經(jīng)典的馮·諾伊曼結(jié)構(gòu)圖,將計(jì)算機(jī)分為五大部分:運(yùn)算器、控制器、存儲(chǔ)器、輸入設(shè)置、輸出設(shè)備。

輸入設(shè)備向計(jì)算機(jī)輸入數(shù)據(jù),輸出設(shè)備接收計(jì)算機(jī)輸出的數(shù)據(jù)。

所以,從計(jì)算機(jī)結(jié)構(gòu)的角度來(lái)看IO,IO就是描述了計(jì)算機(jī)系統(tǒng)和外部設(shè)備之間通信的過(guò)程。

接下來(lái)我們?cè)購(gòu)?strong>應(yīng)用程序的角度去了解一下IO:在操作系統(tǒng)中,為了保證操作系統(tǒng)的穩(wěn)定性和安全性,一個(gè)進(jìn)程的地址空間被劃分為了用戶(hù)空間(User space)和內(nèi)核空間(Kernel space) 。

那么什么是用戶(hù)空間,什么是內(nèi)核空間呢?

  • 用戶(hù)空間是普通應(yīng)用程序可訪問(wèn)的內(nèi)存區(qū)域。
  • 內(nèi)核空間是操作系統(tǒng)內(nèi)核訪問(wèn)的區(qū)域,獨(dú)立于普通的應(yīng)用程序,是受保護(hù)的內(nèi)存空間。

可以簡(jiǎn)單的理解為我們平常運(yùn)行的應(yīng)用程序,都是運(yùn)行在用戶(hù)空間中的,它沒(méi)有權(quán)限去進(jìn)行一些系統(tǒng)態(tài)級(jí)別的資源相關(guān)操作,比如文件管理、內(nèi)存管理、等等,這些操作都是要依賴(lài)內(nèi)核空間才能完成,也就是說(shuō),我們?nèi)绻胍M(jìn)行IO操作,一定是要依賴(lài)內(nèi)核空間的能力,并且這里需要注意一點(diǎn):用戶(hù)空間的程序不能直接訪問(wèn)內(nèi)核空間

那么如果要發(fā)起一次IO操作,那應(yīng)該怎么辦呢?

當(dāng)我們需要執(zhí)行一次IO操作的時(shí)候,由于沒(méi)有執(zhí)行IO操作的權(quán)限,只能發(fā)起系統(tǒng)調(diào)用請(qǐng)求操作系統(tǒng)來(lái)幫忙完成,所以用戶(hù)進(jìn)程想要執(zhí)行IO操作的話,必須通過(guò)系統(tǒng)調(diào)用來(lái)間接的訪問(wèn)內(nèi)核空間,比如我們最常見(jiàn)的IO操作就是磁盤(pán)IO(讀寫(xiě)文件)和網(wǎng)絡(luò)IO(網(wǎng)絡(luò)請(qǐng)求和響應(yīng))。

那么從應(yīng)用程序的視角去看IO的話,我們的應(yīng)用程序發(fā)起對(duì)操作系統(tǒng)的內(nèi)核發(fā)起IO調(diào)用(系統(tǒng)調(diào)用,注意只是調(diào)用),操作系統(tǒng)去負(fù)責(zé)內(nèi)核執(zhí)行具體的IO操作。(如果這段話不是很好理解,可以理解為調(diào)包,比如別人寫(xiě)好了的工具類(lèi),我們不需要關(guān)注里面的實(shí)現(xiàn)細(xì)節(jié),只需要調(diào)用它的方法就好了,這里我們的應(yīng)用程序就是發(fā)起了一個(gè)調(diào)用,但是真正執(zhí)行的還是我們的操作系統(tǒng))

當(dāng)應(yīng)用程序發(fā)起IO調(diào)用之后,會(huì)經(jīng)歷下面兩個(gè)步驟:(這里一定要記住這兩點(diǎn),它和后面息息相關(guān)?。?/strong>

  • 內(nèi)核等待IO設(shè)備準(zhǔn)備好數(shù)據(jù)
  • 內(nèi)核將數(shù)據(jù)從內(nèi)核空間拷貝到用戶(hù)空間

常見(jiàn)的IO模型

IO模型有很多種(比如在UNIX系統(tǒng)下,IO模型一共分為5種:同步阻塞IO、同步非阻塞IO、IO多路復(fù)用、信號(hào)驅(qū)動(dòng)IO、異步IO),本篇文章只講述Java中的IO模型,Java中的IO被分為三類(lèi):BIO、NIO、AIO。

BIO(Blocking IO)

BIO屬于同步阻塞IO模型,應(yīng)用程序發(fā)起read調(diào)用之后,會(huì)一直阻塞,直到內(nèi)核把數(shù)據(jù)從內(nèi)核空間拷貝至用戶(hù)空間。

BIO就是Java中最傳統(tǒng)的IO模型,相關(guān)的類(lèi)和接口都在java.io這個(gè)包下面,因?yàn)楝F(xiàn)在用的人很少(后面看它的特點(diǎn)就知道為什么了),所以我們這里簡(jiǎn)單介紹一下它的一些特點(diǎn)就好了。

  • 對(duì)高并發(fā)場(chǎng)景下對(duì)于線程資源的消耗較高,每一個(gè)連接需要使用一條線程單獨(dú)處理。
  • 傳輸較小對(duì)象時(shí)存在頻繁的線程上下文切換等性能問(wèn)題。

如何優(yōu)化

那么怎么去優(yōu)化這個(gè)BIO呢?

首先上面說(shuō)了BIO的缺點(diǎn)之一就是它是有多少連接就需要多少線程的模型,但是對(duì)于用戶(hù)來(lái)說(shuō),打開(kāi)一個(gè)連接,然后關(guān)閉一個(gè)連接是十分常見(jiàn)且頻繁的事情,而與之對(duì)應(yīng)的就是創(chuàng)建線程和銷(xiāo)毀線程,但是創(chuàng)建線程和銷(xiāo)毀線程對(duì)于操作系統(tǒng)來(lái)說(shuō)是十分消耗資源的,所以想到的優(yōu)化就是使用線程池去進(jìn)行優(yōu)化BIO。

NIO的面世

但是BIO的模型決定了它的上限,它始終是同步阻塞的IO模型,阻塞就會(huì)導(dǎo)致不能使用單線程處理多個(gè)請(qǐng)求,所以這個(gè)時(shí)候就需要修改它的模型,將調(diào)用read()、write()方法不再是阻塞的,這樣就可以使用單線程處理多個(gè)請(qǐng)求,而這樣就不再是同步阻塞的IO模型了,也就是我們下面要說(shuō)到的NIO了。

NIO(Non-blocking/New IO)

Java的NIO是Java1.4引入的,對(duì)應(yīng)的是java.nio包,提供了channel、selector、buffer等抽象。

Java中的NIO可以看作是IO多路復(fù)用模型,但是也有人認(rèn)為它是同步非阻塞IO模型,這里我們先簡(jiǎn)單介紹一下這兩種模型:

同步非阻塞IO模型

這個(gè)相比同步阻塞IO模型,同步非阻塞IO模型就是通過(guò)輪詢(xún)的方式,避免了一直阻塞。

但是從圖中也能看出問(wèn)題所在,就是應(yīng)用程序不斷的進(jìn)行IO系統(tǒng)調(diào)用輪詢(xún)數(shù)據(jù)是否已經(jīng)準(zhǔn)備就緒的這段時(shí)間,是十分消耗CPU資源的(說(shuō)白話就是反復(fù)調(diào)用read操作) 。

所以這個(gè)時(shí)候就引入了IO多路復(fù)用模型。

IO多路復(fù)用模型

在IO多路復(fù)用模型中,線程首先發(fā)起select調(diào)用,詢(xún)問(wèn)內(nèi)核數(shù)據(jù)是否準(zhǔn)備就緒,等待內(nèi)核把數(shù)據(jù)準(zhǔn)備好了,會(huì)返回一個(gè)ready調(diào)用,告訴你,我準(zhǔn)備好了,這個(gè)時(shí)候用戶(hù)線程再發(fā)起read調(diào)用。注意:read調(diào)用的過(guò)程依然是阻塞的(數(shù)據(jù)從內(nèi)核空間拷貝至用戶(hù)空間這段時(shí)間) 。

IO多路復(fù)用模型通過(guò)無(wú)效的系統(tǒng)調(diào)用,減少了對(duì)CPU資源的消耗

Java中的NIO

Java中的NIO,有一個(gè)十分重要的概念,就是選擇器(selector),也被稱(chēng)為多路復(fù)用器,通過(guò)它就可以實(shí)現(xiàn)使用一個(gè)線程管理多個(gè)客戶(hù)端連接(這里是不是和BIO就不一樣了,最大的優(yōu)化的點(diǎn)就在這里) 。當(dāng)客戶(hù)端數(shù)據(jù)到了之后,線程再為客戶(hù)端進(jìn)行服務(wù)。

下面給出一張JavaNIO的圖:

這張圖就能很好的說(shuō)明了NIO的特點(diǎn)了。

AIO(Asynchronous IO)

AIO,也被稱(chēng)為NIO 2.0,Java7中引入的異步IO模型,很多人都不理解非阻塞IO和異步IO到底有什么差別,其實(shí)異步IO就是基于事件和回調(diào)機(jī)制去實(shí)現(xiàn)的,也就是說(shuō)用戶(hù)調(diào)用操作之后會(huì)立馬返回,不會(huì)阻塞,當(dāng)后臺(tái)處理完成,操作系統(tǒng)會(huì)通知相應(yīng)的線程進(jìn)行后續(xù)操作。

目前來(lái)說(shuō)AIO的應(yīng)用還沒(méi)有十分廣泛,應(yīng)用最多的是NIO。

總結(jié)

最后放一張圖來(lái)總結(jié)Java中的IO模型:

到此這篇關(guān)于一文讓你了解透徹Java中的IO模型的文章就介紹到這了,更多相關(guān)Java IO模型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 自定義JmsListenerContainerFactory時(shí),containerFactory字段解讀

    自定義JmsListenerContainerFactory時(shí),containerFactory字段解讀

    這篇文章主要介紹了自定義JmsListenerContainerFactory時(shí),containerFactory字段解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 關(guān)于MyBatis中Mapper?XML熱加載優(yōu)化

    關(guān)于MyBatis中Mapper?XML熱加載優(yōu)化

    大家好,本篇文章主要講的是關(guān)于MyBatis中Mapper?XML熱加載優(yōu)化,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • java導(dǎo)出csv方法實(shí)現(xiàn)講解

    java導(dǎo)出csv方法實(shí)現(xiàn)講解

    這篇文章主要介紹了java導(dǎo)出csv的方法,客戶(hù)要求在項(xiàng)目中有導(dǎo)出CSV文件的功能,并且給出了如何在不知道如何在不知道對(duì)象類(lèi)型(沒(méi)有應(yīng)用泛型)的List中如何得到對(duì)象的屬性值,下面就詳細(xì)說(shuō)下這個(gè)功能是如何實(shí)現(xiàn)的
    2013-12-12
  • Maven中利用assembly插件打包jar包

    Maven中利用assembly插件打包jar包

    本文詳細(xì)講解了Maven中利用assembly插件打包jar包的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • SpringBoot 如何自定義項(xiàng)目啟動(dòng)信息打印

    SpringBoot 如何自定義項(xiàng)目啟動(dòng)信息打印

    這篇文章主要介紹了SpringBoot 如何自定義項(xiàng)目啟動(dòng)信息打印方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 如何處理后臺(tái)向前臺(tái)傳遞的json數(shù)據(jù)

    如何處理后臺(tái)向前臺(tái)傳遞的json數(shù)據(jù)

    這篇文章主要介紹了如何處理后臺(tái)向前臺(tái)傳遞的json數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • java之jvm加載器例舉

    java之jvm加載器例舉

    在本篇文章里小編給大家介紹了關(guān)于java之jvm加載器例舉內(nèi)容,對(duì)此有需要的程序員朋友們可以參考下。
    2021-03-03
  • spring kafka框架中@KafkaListener 注解解讀和使用案例

    spring kafka框架中@KafkaListener 注解解讀和使用案例

    Kafka 目前主要作為一個(gè)分布式的發(fā)布訂閱式的消息系統(tǒng)使用,也是目前最流行的消息隊(duì)列系統(tǒng)之一,這篇文章主要介紹了kafka @KafkaListener 注解解讀,需要的朋友可以參考下
    2023-02-02
  • Java實(shí)現(xiàn)簡(jiǎn)單的抽牌游戲

    Java實(shí)現(xiàn)簡(jiǎn)單的抽牌游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的抽牌游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 簡(jiǎn)單談?wù)刯ava自定義注解

    簡(jiǎn)單談?wù)刯ava自定義注解

    下面小編就為大家?guī)?lái)一篇簡(jiǎn)單談?wù)刯ava自定義注解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07

最新評(píng)論