IO模型種類

文章目錄

      • 同步阻塞 I/O(Blocking I/O,BIO)
      • 同步非阻塞 I/O(Non-blocking I/O,NIO)
      • I/O 多路復用(I/O Multiplexing)
      • 信號驅動 I/O(Signal-driven I/O)
      • 異步 I/O(Asynchronous I/O,AIO)

在計算機編程和操作系統領域,I/O(輸入/輸出)模型是處理輸入輸出操作的不同方式,主要用于解決應用程序如何與外部設備(如磁盤、網絡等)進行數據交互的問題。

同步阻塞 I/O(Blocking I/O,BIO)

  • 工作原理:在這種模型中,當應用程序發起一個 I/O 操作時,會一直阻塞等待,直到該操作完成并返回結果。在此期間,應用程序不能進行其他操作,CPU 資源被閑置。例如,在網絡編程中,當調用 recv 函數接收數據時,程序會一直等待,直到有數據到達或者發生錯誤。
  • 應用場景:適用于連接數比較少且固定的場景,因為它的實現簡單,但處理效率較低。比如一些傳統的單機應用程序,對并發處理要求不高的場景。
  • 示例代碼(Python)
import socketserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8888))
server_socket.listen(1)print('Waiting for a connection...')
conn, addr = server_socket.accept()
print(f'Connected by {addr}')data = conn.recv(1024)  # 阻塞等待數據
print(f'Received: {data.decode()}')conn.sendall(b'Hello, client!')
conn.close()

同步非阻塞 I/O(Non-blocking I/O,NIO)

  • 工作原理:應用程序發起 I/O 操作后,不會阻塞等待結果,而是立即返回。應用程序需要不斷地輪詢檢查 I/O 操作的狀態,直到操作完成。這種方式可以讓應用程序在等待 I/O 操作的同時進行其他任務,但頻繁的輪詢會消耗大量的 CPU 資源。
  • 應用場景:適用于連接數較多,但每個連接的 I/O 操作比較少的場景。例如,在一些簡單的網絡爬蟲程序中,可以使用非阻塞 I/O 同時處理多個網絡請求。
  • 示例代碼(Python)
import socketserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8888))
server_socket.listen(1)
server_socket.setblocking(False)  # 設置為非阻塞模式while True:try:conn, addr = server_socket.accept()print(f'Connected by {addr}')conn.setblocking(False)  # 設置連接為非阻塞模式try:data = conn.recv(1024)if data:print(f'Received: {data.decode()}')conn.sendall(b'Hello, client!')except BlockingIOError:passexcept BlockingIOError:pass

I/O 多路復用(I/O Multiplexing)

  • 工作原理:通過一個機制(如 selectpollepoll 等)同時監視多個 I/O 事件,當其中任何一個 I/O 事件就緒時,通知應用程序進行相應的處理。應用程序在等待期間可以進行其他操作,避免了同步阻塞 I/O 中 CPU 資源的閑置。
  • 應用場景:適用于連接數較多且連接比較活躍的場景,如網絡服務器。通過 I/O 多路復用,可以高效地處理大量的并發連接。
  • 示例代碼(Python 使用 select
import socket
import selectserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8888))
server_socket.listen(5)inputs = [server_socket]while True:readable, _, _ = select.select(inputs, [], [])for sock in readable:if sock is server_socket:conn, addr = server_socket.accept()print(f'Connected by {addr}')inputs.append(conn)else:data = sock.recv(1024)if data:print(f'Received: {data.decode()}')sock.sendall(b'Hello, client!')else:inputs.remove(sock)sock.close()

信號驅動 I/O(Signal-driven I/O)

  • 工作原理:應用程序發起 I/O 操作后,會立即返回,當 I/O 操作完成時,操作系統會發送一個信號通知應用程序。應用程序在等待信號期間可以進行其他操作。
  • 應用場景:相對較少使用,主要用于一些對實時性要求較高,但對數據傳輸量要求不高的場景。
  • 示例代碼(C 語言):由于信號驅動 I/O 涉及底層系統調用和信號處理,代碼較為復雜,以下是一個簡單的偽代碼示例:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <unistd.h>// 信號處理函數
void sigio_handler(int signo) {// 處理 I/O 就緒事件printf("I/O is ready!\n");
}int main() {int sockfd;struct sockaddr_in server_addr;// 創建套接字sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}// 設置服務器地址server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(8888);// 綁定套接字if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 監聽連接if (listen(sockfd, 5) < 0) {perror("listen failed");exit(EXIT_FAILURE);}// 設置信號處理函數signal(SIGIO, sigio_handler);// 設置套接字為信號驅動 I/O 模式fcntl(sockfd, F_SETOWN, getpid());int flags = fcntl(sockfd, F_GETFL);fcntl(sockfd, F_SETFL, flags | O_ASYNC);while (1) {// 可以進行其他操作sleep(1);}return 0;
}

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

  • 工作原理:應用程序發起 I/O 操作后,立即返回,繼續執行其他任務。操作系統會在 I/O 操作完成后,將結果直接返回給應用程序,而不需要應用程序進行額外的查詢或處理。這種方式實現了真正的并發,應用程序的效率最高。
  • 應用場景:適用于對 I/O 性能要求極高的場景,如大型數據庫服務器、高性能網絡服務器等。
  • 示例代碼(Python 使用 asyncio 庫模擬異步 I/O)
import asyncioasync def handle_connection(reader, writer):data = await reader.read(1024)message = data.decode()print(f'Received: {message}')writer.write(b'Hello, client!')await writer.drain()writer.close()async def main():server = await asyncio.start_server(handle_connection, 'localhost', 8888)addr = server.sockets[0].getsockname()print(f'Serving on {addr}')async with server:await server.serve_forever()asyncio.run(main())

這些 I/O 模型各有優缺點,在不同的應用場景中可以選擇合適的模型來提高程序的性能和效率。

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

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

相關文章

C語言入門教程100講(40)文件定位

文章目錄 1. 什么是文件定位?2. 文件指針3. 文件定位函數3.1 `fseek` 函數3.2 `ftell` 函數3.3 `rewind` 函數4. 示例代碼代碼解析:輸出結果:5. 常見問題問題 1:`fseek` 的 `offset` 參數可以為負數嗎?問題 2:如何判斷文件定位是否成功?問題 3:`rewind` 和 `fseek(file…

el-table折疊懶加載支持排序

el-table折疊懶加載支持排序 因為el-table懶加載的子節點是通過緩存實現的&#xff0c;如果想在展開的情況下直接刷新對應子節點數據&#xff0c;要操作el-table組件自身數據&#xff0c;否則不會更新 以排序功能為例 maps: new Map() //用于存儲子節點懶加載的數據// 加載子…

Off-Road-Freespace-Detection配置pytorch2.0.0

一、概述 在github上進行開源代碼搜索&#xff0c;發現了Off-Road-Freespace-Detection&#xff08;鏈接如下所示&#xff09;。這是對越野環境可通行區域的檢測&#xff0c;在經過測試之后&#xff0c;發現對自己有益。 GitHub - chaytonmin/Off-Road-Freespace-Detection: O…

ChatGPT降低論文AIGC重復率的提示詞合集(高效降重方法)

&#x1f4a1; 問題&#xff1a;寫完畢業論文后&#xff0c;查AIGC率過高&#xff0c;手動降重后仍然很高&#xff0c;該怎么辦&#xff1f; &#x1f4cc; 解決方案&#xff1a; 1?? 先查AIGC率&#xff08;找出AI生成的部分&#xff09; 2?? 用ChatGPT優化&#xff08;使…

【Spring 新特性全解析】

Spring 新特性全解析 引言 在當今 Java 企業級開發領域&#xff0c;Spring 框架無疑是中流砥柱般的存在。它以其強大的功能、高度的可擴展性和便捷的開發體驗&#xff0c;贏得了廣大開發者的青睞。隨著技術的不斷演進&#xff0c;Spring 也在持續更新迭代&#xff0c;帶來了一…

System.arraycopy 在音視頻處理中的應用

在音視頻開發領域&#xff0c;我們經常需要處理大量的數據&#xff0c;例如音頻 PCM 數據的傳輸、視頻幀的緩存等。在這些場景下&#xff0c;數據的復制與傳輸往往直接影響到應用的性能。Java 提供的 System.arraycopy 方法&#xff0c;在音視頻處理代碼中出現頻率非常高。本文…

fastapi+angular評論和回復

說明&#xff1a;fastapiangular評論和回復 效果圖: step1:sql show databases; DROP TABLE users; SHOW CREATE TABLE db_school.users; show tables; use db_school; SELECT * FROM db_school.jewelry_categories; CREATE DATABASE db_school; select *from users -- 用戶…

C++11QT復習 (三)

文章目錄 [toc]Day5-2 文件IO&#xff08;2025.03.24&#xff09;1. 緩沖區與刷新1.1 常見的緩沖刷新方式 2. 文件讀寫操作2.1 讀取文件2.2 寫入文件2.3 追加模式寫入2.3 完整代碼 3. 文件定位操作4. 字符串IO5. 配置文件解析示例6. 完整代碼7. 二進制文件操作總結 Day5-2 文件…

Redis Sentinel 詳解

Redis Sentinel 詳解 1. 什么是 Redis Sentinel&#xff1f;有什么用&#xff1f; Redis Sentinel&#xff08;哨兵&#xff09; 是 Redis 官方提供的高可用性解決方案&#xff0c;主要用于監控、通知和自動故障轉移。當 Redis 主節點&#xff08;master&#xff09;發生故障…

AI日報 - 2025年3月25日

&#x1f31f; 今日概覽&#xff08;60秒速覽&#xff09; ▎&#x1f916; AGI突破 | Nebula&#xff08;Google Gemini 2.0 Pro&#xff09;破解復雜數學謎題 編碼與推理能力再上新臺階 ▎&#x1f4bc; 商業動向 | Sesame AI開源10億參數語音模型CSM-1B 語音AI進入普惠時代 …

AI醫療革命:英偉達GTC 2025醫療健康與生命科學會議全分析

AI醫療革命:英偉達GTC 2025醫療健康與生命科學會議全分析 一、GTC 2025:AI 醫療的算力與生態雙突破 1.1 黃仁勛演講核心:從訓練到推理的代際跨越 在科技界矚目的英偉達 GTC 2025 大會上,英偉達 CEO 黃仁勛的主題演講成為全場焦點,為 AI 醫療領域帶來了極具變革性的消息。…

【機器學習/大模型/八股文 面經 (一)】

1. PPO算法中使用GAE的好處以及參數γ和λ的作用是什么? 參考答案: GAE(Generalized Advantage Estimation) 的優勢在于通過指數加權多步TD誤差,平衡優勢估計的偏差與方差,提升策略優化的穩定性。γ(折扣因子):控制未來獎勵的衰減程度,值越大表示更關注長期收益。λ…

03 Python 基礎:數據類型、運算符與流程控制解析

文章目錄 一、數據類型 內置的六大類數字類型整數類型 int浮點數 float布爾 bool字符串 str 變量命名 二、數字類型的相互轉換顯式類型的轉換整數&#xff0c;浮點數&#xff0c;復數 之間的顯式轉換 隱式類型的轉換 三、標識符算術運算符比較運算符邏輯運算符位運算符賦值運算…

視頻知識庫初步設想

將視頻字幕提取出來作為知識庫來源定位,下一步設想:把視頻上的圖片信息也精簡出來作為定位。 下面是測試例子: 入參: {"model":"deepseek-ai/DeepSeek-R1-Distill-Llama-8B","messages":[{"role":"system","cont…

數據庫原理13

1.關系模式設計不當引起的問題&#xff1a;數據冗余&#xff1b;更新異常&#xff1b;插入異常&#xff1b;刪除異常 2.外碼可以是單個屬性&#xff0c;也可以是屬性組 3.動態SQL是SQL標準提供的一種語句運行機制 4.若一個模式分解保持函數依賴&#xff0c;則該分解一定具有…

初級:異常處理面試題深度解析

一、引言 在Java開發中&#xff0c;異常處理是確保程序健壯性和穩定性的重要機制。面試官通過相關問題考察候選人對異常處理的理解和運用能力&#xff0c;以及在實際開發中處理異常的經驗。本文將深入剖析常見的異常處理面試題&#xff0c;結合實際開發場景&#xff0c;幫助讀…

Apache Spark - 用于大規模數據分析的統一引擎

Apache Spark - 用于大規模數據分析的統一引擎 下載運行示例和 Shell使用 Spark Connect 在 Anywhere 上運行 Spark 客戶端應用程序 在集群上啟動從這里去哪里使用 Spark Shell 進行交互式分析基本有關數據集作的更多信息緩存 自包含應用程序從這里去哪里 Apache Spark 是用于大…

餐飲管理系統的設計與實現(代碼+數據庫+LW)

摘 要 互聯網發展至今&#xff0c;無論是其理論還是技術都已經成熟&#xff0c;而且它廣泛參與在社會中的方方面面。它讓信息都可以通過網絡傳播&#xff0c;搭配信息管理工具可以很好地為人們提供服務。針對信息管理混亂&#xff0c;出錯率高&#xff0c;信息安全性差&#…

【C#】Winform調用NModbus實現Modbus TCP 主站通訊

一、前言 Modbus是一種串行通信協議&#xff0c;是工業領域全球最流行的協議之一。 1.1 環境 系統&#xff1a;Win11 工具&#xff1a;Visual Studio 2022 .Net 版本&#xff1a;.Net Framework4.6.0 依賴庫&#xff1a;NModbus 3.0.81 1.2 協議類型 Modbus RTU&#xff1a;一…

【leetcode題解】貪心算法

目錄 貪心算法 檸檬水找零 將數組和減半的最少操作次數 最大數 擺動序列 最長遞增子序列 遞增的三元子序列 最長連續遞增序列 買賣股票的最佳時機 買賣股票的最佳時機 II K 次取反后最大化的數組和 按身高排序 優勢洗牌 最長回文串 增減字符串匹配 分發餅干 最…