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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...