Java世界里的BIO,NIO,AIO

来源:https://www.cnblogs.com/dongguangming/archive/2020/04/04/12630162.html
-Advertisement-
Play Games

作為一名程式員,io知識是必不可少,其實一直在和io打交道,要麼顯示要麼隱含給了操作系統,故做下關於io的記錄。說io之前呢,先介紹什麼叫同步非同步丶阻塞非阻塞 1. 同步非同步丶阻塞非阻塞 1.1 同步是指發出一個請求,在沒有得到結果之前該請求就不返回結果,請求返回時,也就得到結果了。比如我經常用燒水 ...


  作為一名程式員,io知識是必不可少,其實一直在和io打交道,要麼顯示要麼隱含給了操作系統,故做下關於io的記錄。說io之前呢,先介紹什麼叫同步非同步丶阻塞非阻塞

1.  同步非同步丶阻塞非阻塞

1.1 同步是指發出一個請求,在沒有得到結果之前該請求就不返回結果,請求返回時,也就得到結果了。比如我經常用燒水壺燒水,沒燒開前一直盯著水壺(等水開)。

1.2 非同步是指發出一個請求後,立刻得到了回應,但沒有返回結果,這時我們可以再處理別的事情(發送其他請求),所以這種方式需要我們通過狀態主動查看是否有了結果, 或者可以設置一個回調來通知調用者。比如燒水時,不需要盯著水壺等水開,也可以做別的事:玩電腦,每兩三分鐘(類似輪詢任務)看看水開了沒有,也可以給水壺設置響鈴(信號通知,發郵件發簡訊),水開了通知了我(don’t call me,I call you)。

1.3  阻塞是指請求結果返回之前,當前線程會被掛起(被阻塞),線程什麼也做不了了,而非阻塞是指請求結果返回之前,當前線程沒有被阻塞,仍然可以做其他事情。

2.  IO模型

一個io請求讀操作,數據會先被拷貝到操作系統內核的緩衝區中,然後從操作系統內核的緩衝區拷貝到應用程式的地址空間,所以整個過程可分為兩個階段:等待I/O數據準備好,這取決於IO目標返回數據的速度, 如網路IO時看網速和數據本身的大小;數據從內核緩衝區拷貝到進程內。

模型分類可分為以下幾種:BIO,NIO,IO多路復用,AIO,我就一一簡單介紹下

2.1  BIO

BIO,全稱是Blocking I/O,中文名叫:阻塞 I/O,整個過程如圖:

應用程式發送請求給內核,然後由內核去進行通信,在內核准備好數據之前這個線程是被掛起的,所以在兩個階段程式都處於掛起狀態, 其 特點就是在IO執行的兩個階段都被block了 。

2.2 NIO

NIO,全稱是Non-Blocking    IO,中文名字叫非阻塞IO,過程如圖示:

發起第一次請求後,線程並沒有被阻塞,它反覆檢查數據是否準備好,把原來大塊不能用的阻塞時間分成了許多“小阻塞”(檢查),所以進程不斷有機會被執行。這個檢查有沒有準備好數據的過程有點類似於“輪詢”。其特點就是程式需要不斷的主動詢問內核數據是否準備好。第一個階段非阻塞,第二個階段阻塞。

2.3  IO多路復用(重點,此模型不少中間件都用到了)

IO多路復用(I/O Multiplexing)有selectpollepoll等不同方式,它的優點在於單個線程可以同時處理多個網路IO。不同於NIO中輪詢操作是用戶線程進行的,而IO多路復用調用操作系統級別的selectpoll或epoll模型,由系統進行監控IO狀態。select輪詢可以監控許多socket的IO請求,當有一個socket的數據準備好時就可以返回。多路復用IO過程圖:

與NIO不同的是,select不是等到所有數據準備好才返回,而是只要有一個準備好就返回,它的強項在於可以同時處理多個連接。 其 特點是用戶進程能同時等待多個IO請求,系統來監控IO狀態,其中的任意一個進入讀就緒狀態,select函數就可以返回。 nio在java1.4才引入java new io

2.4  AIO

AIO全稱是Asynchronous I/O,中文名叫:非同步 I/O,它是Java1.7 才引入。整個過程中,用戶線程發起一個系統調用之後無須等待,可以處理別的事情。由操作系統等待接收內容,接收後把數據拷貝到用戶進程中,最後通知用戶程式已經可以使用數據了,兩個階段都是非阻塞的。整個過程如下圖

Java中可通過以下兩種方式實現:

一種是基於”回調”,我們可以實現CompletionHandler介面,在調用時把回調函數傳遞給對應的API即可;

一種是返回一個Future。處理完別的事情,可以通過isDone()可查看是否已經準備好數據,通過get()方法等待返回數據。

好了,暫且就寫這麼多,多多交流探討

參考:

1.  OReilly.Java.I.O.2nd.Edition.May.2006

2.   Unix網路編程捲1(幾種io模型)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • vertical-align屬性主要用於改變行內元素的對齊方式,對於行內佈局影響很大,如果不瞭解的話,我們開發調整樣式的時候很容易出錯。 網上關於這個屬性的原理說得很是複雜,看一眼就讓人覺得望而生畏,而且大可不必完全理解其原理,只要懂得其規律,我們足夠使用即可,下麵把我的理解分享給大家: 基線 要了 ...
  • 目前室內三維地圖如何輕量化,能夠在手機微信、電腦瀏覽器等平臺快速顯示地圖,顯示的地圖性能好,轉動地圖不卡是大家都要面對的問題, 使用室內三維地圖引擎ESMap後目前可以不用操心這方面的問題,開發只需要關心設備如何加到地圖上進行管理,本文章主要介紹攝像頭圖層、消防設備圖層和人員軌跡圖層進行介紹,方便大... ...
  • JavaScript 是基於面向對象和事件驅動的一門語言,事件模型是 DOM 中至關重要的內容,理解事件驅動機制、事件反饋、事件冒泡、事件捕獲以及事件委托能幫助我們更好的處理事件,寫出更優的代碼 ...
  • 01. 聊 啥 關註“一猿小講”的都知道,我們之前分享過應用架構、應用監控、日誌歸集以及程式員日常內心的那些小揪揪,幾乎成了小講、雜談的一畝三分地。 說實話,挺神奇,我也不知道每次會給大家帶來什麼驚喜。 今天的分享也不例外,你們肯定也意想不到,今天我分享的主題居然是:矛與盾,如何做好系統之盾;說人話 ...
  • 默默在看新機會的你,是不是面試的時候,偶爾被問起“能不能簡單介紹一下項目的應用系統架構”? 沉迷於業務開發的你們,有沒有考慮過“用戶訪問到你開發的業務功能,到底經過了哪些環節”? 今天我將結合這些年的一些認知理解,開壇設法給大家講一講應用系統架構的從 0 到 1。 01. 如何造一個大泥球? 產品汪 ...
  • 基本定義 裝飾者模式屬於 結構型模式 ,它可以 動態的 將新功能 附加到對象上 ,同時又 不改變其結構 。在對象功能擴展方面,它比繼承更有彈性,裝飾者模式也體現了開閉原則(OCP)。 模式結構 裝飾者和被裝飾者有 相同的超類型 ,因為裝飾者和被裝飾者必須是一樣的類型, 利用繼承是為了達到類型的匹配, ...
  • 基於觀察者模式,構建自己的一套事件分發系統。由常見的引用耦合問題,引出觀察者模式,進而利用觀察者模式的最佳實踐,事件分發系統來解決耦合問題。文章詳細解讀了事件分發系統的實現步驟,以及需要註意的一些坑。 ...
  • 1. 新建項目 IDEA中新建Maven項目,使用Maven Archetype原型:maven archetype webapp 新建項目結構為: 2. 新建包目錄 新建Java代碼目錄:src.main.java 下新建分層模型package,帶上項目的 (僅供參考) :存放全局變數,公共枚舉等 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...