阻塞 IO為什么叫BIO,非阻塞IO為什么叫NIO,異步IO為什么叫AIO

IO

IO的核心就是數據傳輸,也就是程序與外部設備之間進行傳輸,通過IO的核心可以分為,

文件IO和網絡IO

文件IO交互的對象就是本地存儲設備,比方說讀寫本地文件。

網絡IO交互的對象就是網絡設備,核心的應用場景就是網絡通信。

按照操作方式來進行劃分:同步IO和異步IO

同步IO核心邏輯是指調用者發起IO請求之后必須等待IO操作完全完成,才能繼續執行,缺點就是效率低,應用場景大部分簡單業務。

異步IO調用者發起IO請求后,無需等待,直接返回,IO完成后內核通知告知調用者和。缺點就是邏輯復雜,需要進行通知處理,應用在高并發場景。

按照內核是否拷貝數據分:阻塞IO和非阻塞IO。

阻塞IO核心邏輯是發起請求之后內核若數據未準備好,會讓調用者阻塞,直到數據準備好并完成拷貝,才會叫醒調用者。

非阻塞IO:核心邏輯是調用者發起請求后,內核數據未準備好,會立即返回未就緒狀態,調用者需要通過輪詢進行反復的查找,確認數據是否準備好

經典IO模型

1. BIO - Blocking I/O (阻塞 I/O)

  • 為什么叫“BIO”?
    因為它代表?Blocking I/O。在 Java 1.4 之前,只有一套原始的 I/O API(java.io?包,如?InputStream,?OutputStream,?ServerSocket,?Socket)。這套 API 的核心特征就是?阻塞

  • “阻塞”體現在哪里?
    當線程調用?read()?或?accept()?等方法時,線程會被掛起,直到數據準備好或連接建立成功。在此期間,這個線程什么也干不了,就像被“阻塞”住了一樣。

  • 設計模式
    通常采用?“一個連接一個線程”?的模型。當并發連接數很高時,需要創建大量線程,而線程上下文切換的開銷巨大,會耗盡系統資源。

結論:BIO 是以其最核心的特征——Blocking(阻塞)——來命名的。


2. NIO - New I/O / Non-blocking I/O (新的 I/O / 非阻塞 I/O)

  • 為什么叫“NIO”?
    這個名字有雙重含義

    1. 字面意思:New I/O。因為在 Java 1.4 中,它是一套全新的?I/O API(java.nio?包),旨在解決 BIO 的性能瓶頸。

    2. 核心特性:Non-blocking I/O。這是這套新 API 最引人注目的特性之一。它提供了非阻塞的工作模式。

  • “非阻塞”體現在哪里?
    線程可以向通道(Channel)發起一個讀請求,如果當時沒有數據可用,線程不會被掛起,而是立刻得到一個返回結果(比如返回 0),然后這個線程可以馬上去處理其他通道的請求。

  • 核心機制
    它的非阻塞能力是建立在?I/O 多路復用?機制之上的(通過?Selector?實現)。一個線程可以輪詢多個通道(Channel),看哪些已經就緒,然后只對那些就緒的通道進行實際的 I/O 操作。這才是它能夠用少量線程處理大量連接的關鍵。

結論:NIO 的名字既代表了它是“新”的 API,也強調了其“非阻塞”的核心特性。


3. AIO - Asynchronous I/O (異步 I/O)

  • 為什么叫“AIO”?
    因為它代表?Asynchronous I/O。這是在 Java 7 中引入的,更加強大和徹底的異步 I/O 模型。

  • “異步”體現在哪里?
    它與“非阻塞”有本質區別:

    • NIO (Non-blocking): 是?同步的。你需要不斷地主動去問(輪詢)數據好了沒有,然后自己去拷貝數據。

    • AIO (Asynchronous): 是?真正異步的。你只需要發起一個 I/O 操作(如?read),并提供一個回調函數。當內核完成所有工作(包括數據準備和從內核空間拷貝到用戶空間)后,會主動通知你,并調用你提供的回調函數。

    整個過程,應用程序線程完全不需要參與,可以繼續執行其他邏輯。

  • 實現
    在 Java 中,AIO 的相關類在?java.nio.channels?包下,主要以?AsynchronousSocketChannel,?AsynchronousServerSocketChannel?和?CompletionHandler?為核心。

結論:AIO 的名字準確地描述了其“異步”的本質特征,即“你叫我,我來做,做好了回調告訴你”。

縮寫全稱中文核心特征模型比喻
BIOBlocking I/O阻塞式 I/O調用會阻塞線程同步阻塞同步排隊:在餐廳點餐后,必須站在柜臺前傻等,直到餐做好。
NIONew I/O Non-blocking I/O新的 I/O 非阻塞 I/O調用不會阻塞線程同步非阻塞 (I/O多路復用)異步排隊:點餐后拿個號,你可以去玩手機,但需要不時抬頭看屏幕是否叫到你的號,然后自己去取
AIOAsynchronous I/O異步 I/O由系統完成后回調異步非阻塞外賣手機下單后就不用管了,外賣小哥會直接送到你手上,并通知你。

“BIO 和 NIO 的命名主要源于 Java API 的演進。BIO 代表 Blocking I/O,強調了其阻塞的特性。NIO 既是 New I/O(一套新的 API),也代表了 Non-blocking I/O(其核心特性之一)。而 AIO 則明確代表了 Asynchronous I/O,即異步 I/O 模型,這是從它們最根本的行為特征來命名的。”

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/97877.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/97877.shtml
英文地址,請注明出處:http://en.pswp.cn/web/97877.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

10分鐘了解什么是多模態大模型

10分鐘了解什么是多模態大模型(MM-LLMs) 1. 什么是多模態 Multimodality 多模態(Multimodality)是指集成和處理兩種或兩種以上不同類型的信息或數據的方法和技術。在機器學習和人工智能領域,多模態涉及的數據類型通常…

通過DSL生成Jenkins流水線

代碼化管理 Jenkins 流水線(Infrastructure as Code) 版本控制:DSL 腳本可以像代碼一樣存入 Git、GitLab 等版本控制系統,所有任務配置的變更都有提交記錄,便于追溯歷史、回滾錯誤。協作效率:團隊成員可以通…

信號量主要API及綜合應用

1.信號量概述信號量是一個底層核心模塊【int】類型變量,記錄當前信號量數據。信號量 P 操作 (sem_wait)線程檢測對應信號量底層 int 數據數值,如果大于 0,當前線程獲得 CPU 執行權,同時將信號量底層 int 數據-1 操作。如果底層數據…

工業自動化領域的“超級跑車”:西門子TDC系統深度解析與實戰架構

工業自動化領域的“超級跑車”:西門子TDC系統深度解析與實戰架構 文章目錄 工業自動化領域的“超級跑車”:西門子TDC系統深度解析與實戰架構引言:當普通PLC遇到性能瓶頸第一章:認識TDC——它不是簡單的“大型PLC”1.1 TDC究竟是什…

MySQL高階查詢語句與視圖實戰指南

MySQL高階查詢語句與視圖實戰指南 文章目錄MySQL高階查詢語句與視圖實戰指南一、常用高階查詢技巧1. 按關鍵字排序(ORDER BY)基礎用法進階用法:多字段排序條件過濾2. 區間判斷與去重(AND/OR DISTINCT)區間判斷&#x…

解決Pytest參數化測試中文顯示亂碼問題:兩種高效方法

在使用Pytest進行參數化測試時,許多開發者都會遇到一個常見但令人頭疼的問題:當測試用例的ids參數包含中文字符時,控制臺輸出會出現亂碼。這不僅影響了測試報告的可讀性,也給測試結果的分析帶來了困難。本文將深入探討這個問題&am…

基于SpringBoot的校園流浪動物救助平臺【spring boot實戰項目、Java畢設、Java項目、Java實戰】

💖💖作者:計算機畢業設計小途 💙💙個人簡介:曾長期從事計算機專業培訓教學,本人也熱愛上課教學,語言擅長Java、微信小程序、Python、Golang、安卓Android等,開發項目包括…

利用kimi k2編寫postgresql協議服務端的嘗試

美團龍貓還是很有自知之明的 提問請用C編寫postgresql協議服務端,能接收psql客戶端或其他采用postgresql協議的工具的請求,實現將用戶請求打印在控制臺,并把回應發給客戶端回答 抱歉,我無法為您編寫完整的 PostgreSQL 協議服務端。…

醫療 AI 再突破:輔助診斷準確率超 90%,但落地醫院仍面臨數據安全與臨床信任難題

一、引言(一)醫療 AI 發展背景在數字化與智能化浪潮的席卷下,醫療領域正經歷著深刻變革,人工智能(AI)技術的融入成為這場變革的關鍵驅動力。近年來,醫療 AI 輔助診斷技術取得重大突破&#xff0…

Rocky Linux10.0安裝zabbix7.4詳細步驟

安裝Rocky Linux10.0系統 請參考Rocky Linux10.0安裝教程-CSDN博客 查看當前系統版本 cat /etc/*release 安裝數據庫 安裝zabbix之前,需要先安裝一個數據庫來承載zabbix的數據。這里我選擇在本機直接安裝一個MariaDB數據庫。 Rocky Linux10.0系統默認不包含MySQ…

JDBC插入數據

文章目錄視頻:JDBC插入數據環境準備寫插入數據屬性配置屬性配置視頻:JDBC插入數據 環境準備 MySQL環境 小皮面板 提供MySQL環境 寫插入數據 屬性配置 聲明變量 屬性配置 # . properties 是一個特俗的map 集合 # key : 字符串 value : 字符串…

GPU 服務器壓力測試核心工具全解析:gpu-burn、cpu-burn 與 CUDA Samples

在 GPU 服務器的性能驗證、穩定性排查與運維管理中,壓力測試是關鍵環節,可有效檢測硬件極限性能、散熱效率及潛在故障。以下從工具原理、核心功能、使用場景等維度,詳細介紹三款核心測試工具,幫助用戶系統掌握 GPU 服務器壓力測試方法。 一、GPU 專屬壓力測試工具:gpu-bu…

Python進程和線程——多線程

前面提到過進程是由很多線程組成的,那么今天廖老師就詳細解釋了線程是如何運行的。首先,,Python的標準庫提供了兩個模塊:_thread和threading,_thread是低級模塊,threading是高級模塊,對_thread進…

【MySQL|第九篇】視圖、函數與優化

目錄 十、視圖 1、簡單視圖: 2、復雜視圖: 3、視圖更新: 十一、函數 1、函數創建: 十二、數據庫優化 1、索引優化: 2、查詢優化: 3、設計優化: 十、視圖 在 MySQL 中,視圖…

使用Docker和虛擬IP在一臺服務器上靈活部署多個Neo4j實例

使用Docker和虛擬IP在一臺服務器上靈活部署多個Neo4j實例 前言 在現代應用開發中,圖數據庫Neo4j因其強大的關系處理能力而備受青睞。但有時候我們需要在同一臺服務器上運行多個Neo4j實例,比如用于開發測試、多租戶環境或者A/B測試。傳統的端口映射方式…

K8s學習筆記(一):Kubernetes架構-原理-組件

Kubernetes(簡稱 K8s)是一款開源的容器編排平臺,核心目標是實現容器化應用的自動化部署、擴展、故障恢復和運維管理。其設計遵循 “主從架構”(Control Plane Node),組件分工明確,通過 “聲明式…

ensp配置學習筆記 比賽版 vlan 靜態路由 ospf bgp dhcp

學習配置VLAN 虛擬局域網,目的讓兩臺在同一網段的設備,在交換機中訪問。基礎指令:sys 進入系統 sysname R1 修改交換機名字為R1 display cur 查看數據、端口等交換機信息 (在端口中,可以直接display this 可以直接看…

倉頡編程語言青少年基礎教程:enum(枚舉)類型和Option類型

倉頡編程語言青少年基礎教程:enum(枚舉)類型和Option類型enum 和 Option 各自解決一類“語義級”問題:enum 讓“取值只在有限集合內”的約束從注釋變成編譯器強制;Option 讓“值可能不存在”的語義顯式化。enum類型enu…

javaEE-Spring IOCDI

目錄 1、什么是Spring: 2.什么是IoC: 3. 什么是控制反轉呢? 4.IoC容器具備以下優點: 5.DI是什么: 依賴注?方法: 三種注入方法的優缺點: Autowired注解注入存在的問題: Autowired和Resource的區別&#xff…

TensorFlow Lite 全面解析:端側部署方案與PyTorch Mobile深度對比

1 TensorFlow Lite 基礎介紹 TensorFlow Lite (TFLite) 是 Google 為移動設備(Android, iOS)、微控制器(Microcontrollers)和其他嵌入式設備(如 Raspberry Pi)開發的輕量級深度學習推理框架。它的核心目標是…