深入理解 BIO、NIO、AIO

目錄

一、同步與非同步

二、阻塞與非阻塞

三、BIO(Blocking I/O,阻塞I/O)

四、NIO(Non-blocking I/O,非阻塞I/O)

五、AIO(Asynchronous I/O,異步I/O)


同步阻塞:燒水一直站旁邊等到水開

同步非阻塞:燒上水后去做其他事,時不時去看一看水開沒開

異步非阻塞:燒上水后去做其他事,直到聽見水開的聲音

一、同步與非同步

  • 同步:同步就是發起一個調用后,被調用者未處理完請求之前,調用不返回。
  • 異步:異步就是發起一個調用后,立刻得到被調用者的回應表示已接收到請求,但是被調用者并沒有返回結果,此時我們可以處理其他的請求,被調用者通常依靠事件,回調等機制來通知調用者其返回結果。

二、阻塞與非阻塞

  • 阻塞:阻塞就是發起一個請求,調用者一直等待請求結果返回,也就是當前線程會被掛起,無法從事其他任務,只有當條件就緒才能繼續。
  • 非阻塞:非阻塞就是發起一個請求,調用者不用一直等著結果返回,可以先去干其他事情。

三、BIO(Blocking I/O,阻塞I/O)

傳統的 I/O 模型,所有操作都是阻塞的。當一個線程執行 I/O 操作(如讀取數據)時,會一直阻塞直到數據準備完成或操作結束,期間無法進行其他任務。

通常采用一連接一線程的模式,即每個客戶端連接都需要一個獨立的線程來處理。

  • 優點:實現簡單,易于理解和編碼。
  • 缺點:資源消耗大,當并發量高時,會創建大量線程,導致系統開銷劇增, scalability(可擴展性)差。
  • 適用場景:并發量小、連接數少且固定的場景,如簡單的本地文件操作或低并發的網絡應用。

四、NIO(Non-blocking I/O,非阻塞I/O)

基于緩沖區(Buffer)、通道(Channel)和選擇器(Selector)實現,操作是非阻塞的。線程在進行 I/O 操作時,如果數據未準備好,不會一直等待,而是可以去處理其他任務,稍后再檢查操作是否完成。

采用多路復用模式,一個選擇器可以監控多個通道的 I/O 事件(如連接請求、數據可讀等),一個線程可以處理多個客戶端連接。

  • 優點:減少了線程數量,降低了系統資源消耗,提高了并發處理能力。
  • 缺點:編程復雜度較高,需要處理緩沖區、通道和選擇器之間的交互。
  • 適用場景:高并發、I/O 密集型的場景,如服務器端的網絡通信(如 Nginx 部分采用了類似 NIO 的思想)。

五、AIO(Asynchronous I/O,異步I/O)

完全異步的 I/O 模型,操作發起后,線程無需等待操作完成,而是繼續執行其他任務,當 I/O 操作完成后,系統會通知線程(通過回調函數等方式)處理結果。

基于回調機制,當應用程序發起 I/O 操作后,內核會在操作完成后主動通知應用程序。

  • 優點:進一步提升了系統的并發處理能力,線程利用率更高,無需像 NIO 那樣主動輪詢檢查操作狀態。
  • 缺點:實現和理解難度較大,在一些場景下可能存在回調嵌套過深的問題。
  • 適用場景:對響應時間要求高、并發量極大的場景,如高性能的服務器端應用、大數據處理等。

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

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

相關文章

電腦無法識別固態硬盤怎么辦?

隨著固態硬盤(SSD)越來越普及,不少用戶在給電腦更換、加裝SSD時會遇到一個讓人頭大的問題——電腦識別不了固態硬盤。可能是開不了機,或者在“此電腦”中找不到硬盤,甚至連系統安裝界面都提示“找不到驅動器”。這時候…

Kingbasepostgis 安裝實踐

文章目錄前言一、安裝準備1.1 部署方案規劃1.2 SELINUX、防火墻狀態檢查1.3 操作系統時間檢查1.4 創建用戶及密碼1.5 目錄創建1.6 操作系統參數配置1.6.1 配置limits.conf文件二、安裝2.1 上傳安裝包以及license授權文件2.2 拷貝安裝文件2.3 命令行方式安裝2.3.1簡介2.3.2 許可…

移動端設備能部署的llm

mlc-llm 內置RedPajama hf示例模型 TheBloke/Mistral-7B-Instruct-v0.2-GGUF https://github.com/mlc-ai/mlc-llm/tree/main llama.cpp https://github.com/ggml-org/llama.cpp reference --- MLC-LLM:大模型如何部署到瀏覽器 / 手機?完整流程復現…

Ubuntu硬盤掛載

一、在 Ubuntu 中,你可以用以下命令快速查看 所有已連接但尚未掛載的硬盤和分區:lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,UUID輸出中 MOUNTPOINT 為空的行,就是 未掛載的分區。sda ├─sda1 500M ext4 /boot ├─sda2 1.8T ntfs └─sda3 …

JavaScript -Socket5代理使用

axios 安裝兩個包 socks-proxy-agent,axios const { SocksProxyAgent } require(socks-proxy-agent); const axios require(axios);const socks5Axios axios.create();const socks5 () > {const socks5Agent new SocksProxyAgent("socks5://112.194.8…

[特殊字符] 從數據庫無法訪問到成功修復崩潰表:一次 MySQL 故障排查實錄

一次典型的 MySQL 故障排查與修復全過程,涵蓋登錄失敗、表崩潰、innodb_force_recovery 救援、壞表剔除與數據恢復等關鍵操作。一、問題背景某業務系統運行多年,數據庫使用的是 MySQL 8.0.18,近期在一次服務器重啟后,發現無法正常…

【Agent】API Reference Manual(API 參考手冊)

https://github.com/Intelligent-Internet/CommonGround/blob/main/docs/framework/03-api-reference.md 以下是這份 API Reference Manual(API 參考手冊) 的完整中文翻譯: API 參考手冊 版本:0.1 目錄 概覽 1.1 API 目的 1.2 通信協議與核心概念 HTTP API 2.1 POST /se…

LeetCode Hot 100 全排列

給定一個不含重復數字的數組 nums ,返回其 所有可能的全排列 。你可以 按任意順序 返回答案。示例 1:輸入:nums [1,2,3] 輸出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2:輸入:nums [0,1]…

AI大模型如何有效識別和糾正數據中的偏見?

當下,人工智能大模型已成為推動各行業發展的關鍵力量,廣泛應用于自然語言處理、圖像識別、醫療診斷、金融風控等領域,為人們的生活和工作帶來了諸多便利。然而,隨著其應用的不斷深入,數據偏見問題逐漸浮出水面&#xf…

如何通過內網穿透,訪問公司內部服務器?

“凌晨2點,銷售總監王姐在機場候機時突然接到客戶電話——對方要求立即查看產品庫存數據。她慌忙翻出筆記本電腦,卻發現公司內網數據庫沒有公網IP,VPN連接又卡在驗證環節……這樣的場景,是否讓你想起某個手忙腳亂的時刻&#xff1…

12. isaacsim4.2教程-ROS 導航

1. Teleport 示例 ROS 服務的作用: 提供了一種同步、請求-響應的通信方式,用于執行那些需要即時獲取結果或狀態反饋的一次性操作或查詢。 Teleport 服務在 ROS 仿真(尤其是 Gazebo)和某些簡單機器人控制中扮演著瞬移機器人或對象…

DeepSpeed-FastGen:通過 MII 和 DeepSpeed-Inference 實現大語言模型的高吞吐文本生成

溫馨提示: 本篇文章已同步至"AI專題精講" DeepSpeed-FastGen:通過 MII 和 DeepSpeed-Inference 實現大語言模型的高吞吐文本生成 摘要 隨著大語言模型(LLM)被廣泛應用,其部署與擴展變得至關重要&#xff0…

操作系統:操作系統的結構(Structures of Operating System)

目錄 簡單結構(Simple Structure) 整體式結構(Monolithic Structure) 什么是 Kernel(內核)? 層次結構(Layered Structure) 微內核結構(Microkernel&#x…

Python柱狀圖

1.各國GDP柱狀圖2.各國GDP時間線柱狀圖

FastGPT:企業級智能問答系統,讓知識庫觸手可及

在信息爆炸的時代,企業如何高效管理和利用海量知識?傳統搜索和文檔庫已難以滿足需求。FastGPT正成為企業構建智能知識核心的首選。一、FastGPT:不止于問答的智能知識引擎FastGPT 顛覆了傳統知識庫的局限,其核心優勢在于&#xff1…

探索 MyBatis-Plus

引言在當今的 Java 開發領域,數據庫操作是一個至關重要的環節。MyBatis 作為一款優秀的持久層框架,已經被廣泛應用。而 MyBatis-Plus 則是在 MyBatis 基礎上進行增強的工具,它簡化了開發流程,提高了開發效率。本文將詳細介紹 MyBa…

Hive【安裝 01】hive-3.1.2版本安裝配置(含 mysql-connector-java-5.1.47.jar 網盤資源)

我使用的安裝文件是 apache-hive-3.1.2-bin.tar.gz ,以下內容均以此版本進行說明。 以下環境測試安裝成功: openEuler 22.03 (LTS-SP1)系統 MySQL-8.0.40 1.前置條件 MySQL數據庫 我安裝的是 mysql-5.7.28 版本的,安裝方法可參考《Linux環境…

璞致 PZSDR-P101:ZYNQ7100+AD9361 架構軟件無線電平臺,重塑寬頻信號處理范式

璞致電子 PZSDR-P101 軟件無線電平臺以 "異構計算 寬頻射頻 工業級可靠性" 為核心設計理念,基于 Xilinx ZYNQ7100 處理器與 ADI AD9361 射頻芯片構建,為工程師提供從 70MHz 到 6GHz 的全頻段信號處理解決方案。無論是頻譜監測、無線通信原型…

【基礎】go基礎學習筆記

基礎及關鍵字if for switch都支持使用隱形聲明(:)來快速聲明一個變量,無需在上面一行額外聲明,這可以增加代碼簡潔性,但不太符合其他常規語言的寫法,需要習慣一下if for switch都不需要使用(&am…