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
  • 前言 插件化的需求主要源於對軟體架構靈活性的追求,特別是在開發大型、複雜或需要不斷更新的軟體系統時,插件化可以提高軟體系統的可擴展性、可定製性、隔離性、安全性、可維護性、模塊化、易於升級和更新以及支持第三方開發等方面的能力,從而滿足不斷變化的業務需求和技術挑戰。 一、插件化探索 在WPF中我們想要開 ...
  • 歡迎ReaLTaiizor是一個用戶友好的、以設計為中心的.NET WinForms項目控制項庫,包含廣泛的組件。您可以使用不同的主題選項對項目進行個性化設置,並自定義用戶控制項,以使您的應用程式更加專業。 項目地址:https://github.com/Taiizor/ReaLTaiizor 步驟1: ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • Channel 是乾什麼的 The System.Threading.Channels namespace provides a set of synchronization data structures for passing data between producers and consume ...
  • efcore如何優雅的實現按年分庫按月分表 介紹 本文ShardinfCore版本 本期主角: ShardingCore 一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案,具有零依賴、零學習成本、零業務代碼入侵適配 距離上次發文.net相關的已經有很久了,期間一直在從事java相關的 ...
  • 前言 Spacesniffer 是一個免費的文件掃描工具,通過使用樹狀圖可視化佈局,可以立即瞭解大文件夾的位置,幫助用戶處理找到這些文件夾 當前系統C盤空間 清理後系統C盤空間 下載 Spacesniffer 下載地址:https://spacesniffer.en.softonic.com/dow ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • 一、ReZero簡介 ReZero是一款.NET中間件 : 全網唯一開源界面操作就能生成API , 可以集成到任何.NET6+ API項目,無破壞性,也可讓非.NET用戶使用exe文件 免費開源:MIT最寬鬆協議 , 一直從事開源事業十年,一直堅持開源 1.1 純ReZero開發 適合.Net Co ...
  • 一:背景 1. 講故事 停了一個月沒有更新文章了,主要是忙於寫 C#內功修煉系列的PPT,現在基本上接近尾聲,可以回頭繼續更新這段時間分析dump的一些事故報告,有朋友微信上找到我,說他們的系統出現了大量的http超時,程式不響應處理了,讓我幫忙看下怎麼回事,dump也抓到了。 二:WinDbg分析 ...
  • 開始做項目管理了(本人3年java,來到這邊之後真沒想到...),天天開會溝通整理需求,他們講話的時候忙裡偷閑整理一下常用的方法,其實語言還是有共通性的,基本上看到方法名就大概能猜出來用法。出去打水的時候看到外面太陽好好,真想在外面坐著曬太陽,回來的時候好兄弟三年前送給我的鍵盤D鍵不靈了,在打"等待 ...