阻塞式IO與非阻塞IO的區別

阻塞式IO與非阻塞IO的區別


1. 阻塞式IO (Blocking I/O)

  • 定義
    當程序發起一個I/O操作(如讀取文件、網絡數據)時,進程會被掛起(阻塞),直到操作完成或超時才會繼續執行后續代碼。在此期間,程序無法執行其他任務。

  • 工作流程

    python

    復制

    data = socket.recv()  # 調用recv()后,程序卡在這里等待數據
    print("收到數據:", data)  # 數據到達后才會執行
  • 特點

    • 優點:編程簡單,代碼直觀。

    • 缺點:資源利用率低(等待期間CPU空閑),不適合高并發場景。

  • 典型場景

    • 簡單的單線程腳本

    • 對實時性要求不高的低頻操作(如命令行工具)


2. 非阻塞式IO (Non-blocking I/O)

  • 定義
    程序發起I/O操作后立即返回,無需等待結果。可以通過輪詢或事件通知機制(如select/epoll)檢查操作狀態,實現并發處理多個I/O。

  • 工作流程

    python

    復制

    socket.setblocking(False)  # 設置為非阻塞模式
    try:data = socket.recv()  # 立即返回,若有數據則返回數據,否則拋異常print("收到數據:", data)
    except BlockingIOError:print("暫時無數據,繼續處理其他任務")  # 程序繼續執行其他邏輯
  • 特點

    • 優點:提高CPU利用率,支持高并發(如同時處理數千連接)。

    • 缺點:編程復雜,需配合多路復用或回調機制。

  • 典型場景

    • Web服務器(Nginx、Node.js)

    • 實時通信系統(WebSocket、游戲服務器)


3. 核心區別

維度阻塞式IO非阻塞式IO
行為調用后卡住,直到I/O完成調用后立即返回,需主動查詢狀態
CPU利用率低(等待期間閑置)高(可并行處理其他任務)
并發能力弱(依賴多線程/進程)強(單線程即可處理大量I/O)
實現復雜度簡單復雜(需搭配多路復用或異步框架)
適用場景低頻、簡單任務高頻、高并發場景

4. 技術實現

阻塞式IO示例(C語言)

c

復制

int fd = open("file.txt", O_RDONLY);
char buf[1024];
read(fd, buf, sizeof(buf)); // 阻塞在此,直到數據讀取完畢
printf("Data: %s\n", buf);
非阻塞式IO示例(C語言)

c

復制

int fd = open("file.txt", O_RDONLY | O_NONBLOCK); // 設置非阻塞標志
char buf[1024];
while (1) {ssize_t n = read(fd, buf, sizeof(buf));if (n > 0) {printf("Data: %s\n", buf);break;} else if (n == -1 && errno == EAGAIN) {// 數據未就緒,處理其他任務usleep(1000); }
}

5. 如何選擇?

  • 選阻塞式IO

    • 開發簡單快速的小工具。

    • 無需高并發(如本地配置文件讀取)。

  • 選非阻塞IO

    • 高并發服務器(如Web服務、實時聊天)。

    • 需要最大限度利用CPU資源的場景。


6. 擴展:同步 vs 異步IO

  • 同步IO:程序主動等待I/O結果(阻塞式、非阻塞式均屬此類)。

  • 異步IO:程序發起I/O后無需等待,操作系統完成后主動通知(如Linux的io_uring、Windows的IOCP)。

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

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

相關文章

Gossip協議:分布式系統中的“八卦”傳播藝術

目錄 一、 什么是Gossip協議?二、 Gossip協議的應用 💡三、 Gossip協議消息傳播模式詳解 📚四、 Gossip協議的優缺點五、 總結: 🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式&…

【C++初階】----模板初階

1.泛型函數 泛型編程:編寫與類型無關的通用代碼,是代碼復用的一種手段。模板是泛型編程的基礎。 2.函數模板 2.1函數模板的概念 函數模板代表了一個函數家族,該函數模板與類型無關,在使用時被參數化,根據實參類型…

git-- github的使用--賬戶和本地連接

以下指令在git 執行bash 流程:先看有沒有密鑰; 沒有的話,在電腦生成密鑰對,公鑰復制到github; 要想使用https,配置令牌,注意令牌有期限問題,連接不了有可能是期限問題 一個電腦對…

OTN(Optical Transport Network)詳解

OTN(光傳送網)是一種基于**波分復用(WDM)**的大容量光傳輸技術,結合了SDH的運維管理優勢和WDM的高帶寬特性,廣泛應用于骨干網、城域核心層及數據中心互聯(DCI)。 1. OTN 的基本概念 …

Python 中列表(List)、元組(Tuple)、集合(Set)和字典(Dict)四大數據結構的完整對比

以下是 Python 中列表(List)、元組(Tuple)、集合(Set)和字典(Dict)四大數據結構的完整對比分析,結合了核心特性、操作方式和應用場景的深度總結: 一、核心特性…

Angular由一個bug說起之十五:自定義基于Overlay的Tooltip

背景 工具提示(tooltip)是一個常見的 UI 組件,用于在用戶與頁面元素交互時提供額外的信息。由于angular/material/tooltip的matTooltip只能顯示純文本,所以我們可以通過自定義Directive來實現一個靈活且功能豐富的tooltip Overlay…

軟件工程面試題(十五)

1、servlet 創建過程以及ruquest,response,session的生命周期? Servlet的創建過程: 第一步 public class AAA extends HttpServlet{ 實現對應的doxxx方法 } 第二步: 在web.xml中配置 <servlet> <servlet-name></servlet-name> <servlet-c…

搭建QNX Software Center的Docker環境

背景 本人使用 Ubuntu Server 22.04 服務器&#xff0c;所以沒有圖形界面&#xff0c;而 QNX Software Center 需要圖形界面。為了保證服務器環境的整理&#xff0c;計劃使用Docker部署QNX Software Center 一瓶安裝圖形界面。本方既是實現方案的記錄。 資源 Dockerfile&…

C#/.NET/.NET Core技術前沿周刊 | 第 31 期(2025年3.17-3.23)

前言 C#/.NET/.NET Core技術前沿周刊&#xff0c;你的每周技術指南針&#xff01;記錄、追蹤C#/.NET/.NET Core領域、生態的每周最新、最實用、最有價值的技術文章、社區動態、優質項目和學習資源等。讓你時刻站在技術前沿&#xff0c;助力技術成長與視野拓寬。 歡迎投稿、推薦…

粘包問題解決方案

粘包問題詳解&#xff1a;TCP協議中的常見問題及Go語言解決方案 一、什么是粘包問題&#xff1f; 粘包問題是指在TCP通信中&#xff0c;發送方發送的多個獨立消息在接收方被合并成一個消息接收的現象。換句話說&#xff0c;發送方發送的多條消息在接收方被“粘”在一起&#…

vue:突然發現onok無法使用

const that this;this.$confirm({title: "修改商品提示",content: "如果當前商品存在于商品活動庫&#xff0c;則在商品活動庫的狀態會下架",onOk: function () {that.submitForm();}}); 突然發現 this.$confirm無法進入onok 最終發現是主題沖突&#x…

redis hashtable 的sizemask理解

在 Redis 的哈希表實現中&#xff0c;index hash & dict->ht[0].sizemask 是計算鍵值對應存儲位置的核心操作。這個操作看起來簡單&#xff0c;但背后涉及哈希表的內存布局和性能優化策略。我們通過以下步驟逐步解析其原理&#xff1a; 一、哈希表的設計目標 快速定位…

Ruby 命令行選項

Ruby 命令行選項 概述 Ruby 是一種廣泛使用的編程語言,它擁有強大的命令行工具,可以幫助開發者進行各種任務。了解 Ruby 的命令行選項對于提高開發效率至關重要。本文將詳細介紹 Ruby 的常用命令行選項,幫助開發者更好地利用 Ruby 的命令行功能。 Ruby 命令行選項概述 R…

【STM32】WDG看門狗(學習筆記)

學習來源----->江協科技STM32 WDG簡介 WDG&#xff08;Watchdog&#xff09;看門狗看門狗可以監控程序的運行狀態&#xff0c;當程序因為設計漏洞、硬件故障、電磁干擾等原因&#xff0c;出現卡死或跑飛現象時&#xff0c;看門狗能及時復位程序&#xff0c;避免程序陷入長…

Java 數據庫連接池

HikariCP 老外開源的。 Spring Boot 2 之后默認選擇的連接池。 號稱性能最快的數據庫連接池。 為什么性能好呢&#xff1f; ● 字節碼級別的優化-盡量的利用 JIT 的內聯手段 ● 字節碼級別的優化-利用更容易被 JVM 優化的指令 ● 代碼級別的優化-利用改造后的 FastList 代替…

Spring Boot中@Valid 與 @Validated 注解的詳解

Spring Boot中Valid 與 Validated 注解的詳解 引言Valid注解功能介紹使用場景代碼樣例 Validated注解功能介紹使用場景代碼樣例 Valid與Validated的區別結論 引言 在Spring Boot應用中&#xff0c;參數校驗是確保數據完整性和一致性的重要手段。Valid和Validated注解是Spring …

C++搜索

功能擴展說明&#xff1a; 圖類封裝&#xff1a;將圖數據結構封裝為類&#xff0c;提高代碼復用性 最短路徑查找&#xff1a;基于BFS實現未加權圖的最短路徑查找 路徑重構&#xff1a;通過parent數組回溯構建完整路徑 異常處理&#xff1a;當路徑不存在時返回空向量 復雜度分析…

2023第十四屆藍橋杯大賽軟件賽國賽C/C++ 大學 B 組(真題題解)(C++/Java題解)

本來想刷省賽題呢&#xff0c;結果一不小心刷成國賽了 真是個小迷糊〒▽〒 但&#xff0c;又如何( ?? ω ?? )? 記錄刷題的過程、感悟、題解。 希望能幫到&#xff0c;那些與我一同前行的&#xff0c;來自遠方的朋友&#x1f609; 大綱&#xff1a; 一、子2023-&#xff…

CSS學習筆記6——網頁布局

目錄 一、元素的浮動屬性、清除浮動 清除浮動的其他方法 1、使用空標簽清除浮動影響 2、使用overflow屬性清除浮動 3、使用偽元素清除浮動影響 原理 overflow屬性 二、元素的定位 1、相對定位 2、絕對定位 ?編輯 3、固定定位 z-index層疊等級屬性 一、元素的浮動…

sqlalchemy:將mysql切換到OpenGauss

說明 之前python的項目使用的mysql&#xff0c;近期要切換到國產數據庫OpenGauss。 之前的方案是fastapisqlalchemy&#xff0c;測試下來發現不用改代碼&#xff0c;只要改下配置即可。 切換方案 安裝openGauss-connector-python-psycopg2 其代碼工程在&#xff1a;https:…