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

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

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

什么是IO

IO(Input/Output),也就是輸入和輸出的簡稱,從計算機結構的角度來看,IO,就是輸入數據到計算機中,計算機輸出數據到計算機外,下面有一張十分經典的馮·諾伊曼結構圖,將計算機分為五大部分:運算器、控制器、存儲器、輸入設置、輸出設備。

輸入設備向計算機輸入數據,輸出設備接收計算機輸出的數據。

所以,從計算機結構的角度來看IO,IO就是描述了計算機系統和外部設備之間通信的過程。

接下來我們再從應用程序的角度去了解一下IO:在操作系統中,為了保證操作系統的穩(wěn)定性和安全性,一個進程的地址空間被劃分為了用戶空間(User space)和內核空間(Kernel space) 。

那么什么是用戶空間,什么是內核空間呢?

  • 用戶空間是普通應用程序可訪問的內存區(qū)域。
  • 內核空間是操作系統內核訪問的區(qū)域,獨立于普通的應用程序,是受保護的內存空間。

可以簡單的理解為我們平常運行的應用程序,都是運行在用戶空間中的,它沒有權限去進行一些系統態(tài)級別的資源相關操作,比如文件管理、內存管理、等等,這些操作都是要依賴內核空間才能完成,也就是說,我們如果想要進行IO操作,一定是要依賴內核空間的能力,并且這里需要注意一點:用戶空間的程序不能直接訪問內核空間。

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

當我們需要執(zhí)行一次IO操作的時候,由于沒有執(zhí)行IO操作的權限,只能發(fā)起系統調用請求操作系統來幫忙完成,所以用戶進程想要執(zhí)行IO操作的話,必須通過系統調用來間接的訪問內核空間,比如我們最常見的IO操作就是磁盤IO(讀寫文件)和網絡IO(網絡請求和響應)。

那么從應用程序的視角去看IO的話,我們的應用程序發(fā)起對操作系統的內核發(fā)起IO調用(系統調用,注意只是調用),操作系統去負責內核執(zhí)行具體的IO操作。(如果這段話不是很好理解,可以理解為調包,比如別人寫好了的工具類,我們不需要關注里面的實現細節(jié),只需要調用它的方法就好了,這里我們的應用程序就是發(fā)起了一個調用,但是真正執(zhí)行的還是我們的操作系統)

當應用程序發(fā)起IO調用之后,會經歷下面兩個步驟:(這里一定要記住這兩點,它和后面息息相關?。?/strong>

  • 內核等待IO設備準備好數據
  • 內核將數據從內核空間拷貝到用戶空間

常見的IO模型

IO模型有很多種(比如在UNIX系統下,IO模型一共分為5種:同步阻塞IO、同步非阻塞IO、IO多路復用、信號驅動IO、異步IO),本篇文章只講述Java中的IO模型,Java中的IO被分為三類:BIO、NIO、AIO。

BIO(Blocking IO)

BIO屬于同步阻塞IO模型,應用程序發(fā)起read調用之后,會一直阻塞,直到內核把數據從內核空間拷貝至用戶空間。

BIO就是Java中最傳統的IO模型,相關的類和接口都在java.io這個包下面,因為現在用的人很少(后面看它的特點就知道為什么了),所以我們這里簡單介紹一下它的一些特點就好了。

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

如何優(yōu)化

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

首先上面說了BIO的缺點之一就是它是有多少連接就需要多少線程的模型,但是對于用戶來說,打開一個連接,然后關閉一個連接是十分常見且頻繁的事情,而與之對應的就是創(chuàng)建線程和銷毀線程,但是創(chuàng)建線程和銷毀線程對于操作系統來說是十分消耗資源的,所以想到的優(yōu)化就是使用線程池去進行優(yōu)化BIO。

NIO的面世

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

NIO(Non-blocking/New IO)

Java的NIO是Java1.4引入的,對應的是java.nio包,提供了channel、selector、buffer等抽象。

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

同步非阻塞IO模型

這個相比同步阻塞IO模型,同步非阻塞IO模型就是通過輪詢的方式,避免了一直阻塞。

但是從圖中也能看出問題所在,就是應用程序不斷的進行IO系統調用輪詢數據是否已經準備就緒的這段時間,是十分消耗CPU資源的(說白話就是反復調用read操作) 。

所以這個時候就引入了IO多路復用模型。

IO多路復用模型

在IO多路復用模型中,線程首先發(fā)起select調用,詢問內核數據是否準備就緒,等待內核把數據準備好了,會返回一個ready調用,告訴你,我準備好了,這個時候用戶線程再發(fā)起read調用。注意:read調用的過程依然是阻塞的(數據從內核空間拷貝至用戶空間這段時間)

IO多路復用模型通過無效的系統調用,減少了對CPU資源的消耗。

Java中的NIO

Java中的NIO,有一個十分重要的概念,就是選擇器(selector),也被稱為多路復用器,通過它就可以實現使用一個線程管理多個客戶端連接(這里是不是和BIO就不一樣了,最大的優(yōu)化的點就在這里) 。當客戶端數據到了之后,線程再為客戶端進行服務。

下面給出一張JavaNIO的圖:

這張圖就能很好的說明了NIO的特點了。

AIO(Asynchronous IO)

AIO,也被稱為NIO 2.0,Java7中引入的異步IO模型,很多人都不理解非阻塞IO和異步IO到底有什么差別,其實異步IO就是基于事件和回調機制去實現的,也就是說用戶調用操作之后會立馬返回,不會阻塞,當后臺處理完成,操作系統會通知相應的線程進行后續(xù)操作

目前來說AIO的應用還沒有十分廣泛,應用最多的是NIO。

總結

最后放一張圖來總結Java中的IO模型:

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

相關文章

  • SpringBoot中AOP的動態(tài)匹配和靜態(tài)匹配詳解

    SpringBoot中AOP的動態(tài)匹配和靜態(tài)匹配詳解

    這篇文章主要介紹了SpringBoot中AOP的動態(tài)匹配和靜態(tài)匹配詳解,在創(chuàng)建代理的時候對目標類的每個連接點使用靜態(tài)切點檢查,如果僅通過靜態(tài)切點檢查就可以知道連接點是不匹配的,則在運行時就不再進行動態(tài)檢查了,需要的朋友可以參考下
    2023-09-09
  • 詳解SpringBoot如何統一后端返回格式

    詳解SpringBoot如何統一后端返回格式

    今天我們來聊一聊在基于SpringBoot前后端分離開發(fā)模式下,如何友好的返回統一的標準格式以及如何優(yōu)雅的處理全局異常,感興趣的可以了解一下
    2021-07-07
  • RxJava的消息發(fā)送和線程切換實現原理

    RxJava的消息發(fā)送和線程切換實現原理

    這篇文章主要介紹了RxJava的消息發(fā)送和線程切換實現原理,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • java使用異或對文件進行加密解密

    java使用異或對文件進行加密解密

    這篇文章主要為大家詳細介紹了java使用異或方式對文件進行加密解密,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • mvc架構實現商品的購買(二)

    mvc架構實現商品的購買(二)

    這篇文章主要為大家詳細介紹了mvc架構實現商品購買功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 最全MyBatis核心配置文件總結(收藏)

    最全MyBatis核心配置文件總結(收藏)

    這篇文章主要介紹了最全MyBatis核心配置文件總結(收藏),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 基于SpringBoot實現定時發(fā)送郵件過程解析

    基于SpringBoot實現定時發(fā)送郵件過程解析

    這篇文章主要介紹了基于SpringBoot實現定時發(fā)送郵件過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • MyBatis 參數類型為String時常見問題及解決方法

    MyBatis 參數類型為String時常見問題及解決方法

    這篇文章主要介紹了MyBatis 參數類型為String時常見問題及解決方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-03-03
  • java單機接口限流處理方案詳解

    java單機接口限流處理方案詳解

    這篇文章主要為大家詳細介紹了java單機接口限流處理方案,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 一篇文章帶你了解XGBoost算法

    一篇文章帶你了解XGBoost算法

    XGBoost全名叫(eXtreme Gradient Boosting)極端梯度提升,經常被用在一些比賽中,其效果顯著。它是大規(guī)模并行boosted tree的工具,它是目前最快最好的開源boosted tree工具包
    2021-08-08

最新評論

娱乐| 新龙县| 蒙自县| 浙江省| 建昌县| 通化县| 陕西省| 莱州市| 北宁市| 曲周县| 阿克陶县| 辽宁省| 洛扎县| 城市| 平山县| 墨竹工卡县| 天长市| 和静县| 裕民县| 梁山县| 泊头市| 普格县| 额敏县| 方城县| 霍州市| 新源县| 沙田区| 中牟县| 永兴县| 江安县| 班戈县| 卢龙县| 临汾市| 铁岭市| 肇东市| 阳东县| 宜川县| 水城县| 广汉市| 老河口市| 内丘县|