【IO復用】五種IO模型

文章目錄

  • 五種IO模型
    • Linux設計哲學
    • BIO
    • NIO
    • AIO
    • SIO
    • IO多路復用

五種IO模型

Linux設計哲學

在linux系統中,實際上所有的I/O設備都被抽象為了文件這個概念,一切皆文件,磁盤、網絡數據、終端,甚至進程間通信工具管道pipe等都被當做文件對待。

在了解多路復用
select、poll、epoll實現之前,我們先簡單回憶復習以下兩個概念:

多路: 指的是多個socket網絡連接;
復用: 指的是復用一個線程、使用一個線程來檢查多個文件描述符(Socket)的就緒狀態
多路復用主要有三種技術:select,poll,epoll。epoll是最新的, 也是目前最好的多路復用技術;
  • blockingIO - 阻塞IO
  • nonblockingIO - 非阻塞IO
  • signaldrivenIO - 信號驅動IO
  • asynchronousIO - 異步IO
  • IOmultiplexing - IO多路復用

其中Java實現了BIO、NIO和AIO

BIO

BIO 是 Java 最早提供的 IO 模型,屬于同步阻塞式 IO。其特點是,在進行讀寫操作時,線程會被阻塞,直到操作完成。

工作原理:每處理一個連接,就需要創建一個獨立的線程。當有大量連接時,會消耗大量的系統資源,導致性能下降。

適用場景:適用于連接數目較少且固定的場景。

示例:

// 服務器端示例
ServerSocket serverSocket = new ServerSocket(8080);
while(true) {// 阻塞等待客戶端連接Socket socket = serverSocket.accept();// 為每個連接創建一個新線程處理new Thread(() -> {// 處理輸入流和輸出流// ...}).start();
}

進程/線程在從調用recvfrom開始到它返回的整段時間內是被阻塞的

recvfrom成功返回后,應用進程/線程開始處理數據報。

主要特點是進程阻塞掛起不消耗CPU資源,能及時響應每個操作;

實現難度低,適用并發量小的網絡應用開發,不適用并發量大的應用,因為一個請求IO會阻塞進程,所以每請求分配一個處理進程(線程)去響應,系統開銷大。

NIO

NIO 是 Java 1.4 引入的新 IO 模型,屬于同步非阻塞式 IO。它的核心組件有 Channel(通道)、Buffer(緩沖區)和 Selector(選擇器)。

工作原理:

Channel:可以進行雙向數據傳輸,類似于傳統 IO 中的流,但功能更強大。
Buffer:數據的讀寫都要通過緩沖區進行,這是一種雙向操作。
Selector:單個線程可以通過選擇器監控多個通道的事件,從而實現非阻塞 IO。

適用場景:適用于連接數目多且連接比較短(輕操作)的場景,例如聊天服務器。

代碼示例:

// 服務器端示例
Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
serverChannel.socket().bind(new InetSocketAddress(8080));
serverChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {// 非阻塞等待事件int readyChannels = selector.selectNow();if (readyChannels > 0) {Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> keyIterator = selectedKeys.iterator();while (keyIterator.hasNext()) {SelectionKey key = keyIterator.next();// 處理不同事件...keyIterator.remove();}}
}

進程發起IO系統調用后,如果內核緩沖區沒有數據,需要到IO設備中讀取,進程返回一個錯誤而不會被阻塞;進程發起IO系統調用后,如果內核緩沖區有數據,內核就會把數據返回進程。

進程輪詢(重復)調用,消耗CPU的資源;
實現難度低、開發應用相對阻塞IO模式較難;
適用并發量較小、且不需要及時響應的網絡應用開發;

AIO

AIO 是 Java 7 引入的異步 IO 模型,也被稱為 NIO 2.0。它基于事件和回調機制,實現了真正的異步非阻塞。

工作原理:應用程序只需發起 IO 操作,然后繼續執行其他任務。當 IO 操作完成后,系統會通過回調函數通知應用程序。
適用場景:適用于連接數目多且連接比較長(重操作)的場景,例如相冊服務器。

代碼示例

// 服務器端示例
AsynchronousServerSocketChannel serverChannel = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(8080));serverChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {@Overridepublic void completed(AsynchronousSocketChannel client, Void attachment) {// 接受下一個連接serverChannel.accept(null, this);// 處理客戶端連接...}@Overridepublic void failed(Throwable exc, Void attachment) {// 處理失敗情況}
});

當進程發起一個IO操作,進程返回(不阻塞),但也不能返回果結;內核把整個IO處理完后,會通知進程結果。如果IO操作成功則進程直接獲取到數據。

特點:

不阻塞,數據一步到位;Proactor模式;
需要操作系統的底層支持,LINUX 2.5 版本內核首現,2.6 版本產品的內核標準特性;
實現、開發應用難度大;
非常適合高性能高并發應用;

SIO

signaldrivenIO - 信號驅動IO

當進程發起一個IO操作,會向內核注冊一個信號處理函數,然后進程返回不阻塞;當內核數據就緒時會發送一個信號給進程,進程便在信號處理函數中調用IO讀取數據。

特點:回調機制,實現、開發應用難度大;

IO多路復用

大多數文件系統的默認IO操作都是緩存IO。在Linux的緩存IO機制中,操作系統會將IO的數據緩存在文件系統的頁緩存

(page cache)。也就是說,數據會先被拷貝到操作系統內核的緩沖區中,然后才會從操作系統內核的緩存區拷貝到應用程序的地址空間中。

這種做法的缺點就是,需要在應用程序地址空間和內核進行多次拷貝,這些拷貝動作所帶來的CPU以及內存開銷是非常大的。

至于為什么不能直接讓磁盤控制器把數據送到應用程序的地址空間中呢?最簡單的一個原因就是應用程序不能直接操作底層硬件。

總的來說,IO分兩階段:

1)數據準備階段

2)內核空間復制回用戶進程緩沖區階段

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

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

相關文章

FeatherScan v4.0 – 適用于Linux的全自動內網信息收集工具

前言 在平時滲透打靶的時候&#xff0c;經常要自己手工輸入命令&#xff0c;做各種基本的信息收集&#xff0c;非常的繁瑣&#xff0c;所以自研了一款工具&#xff0c;這款工具沒有接入AI&#xff0c;因為不合適&#xff0c;接入了AI的話在一些不能上網的環境下進行信息收集&a…

如何精準篩選優質SEO服務資源?

核心要點&#xff1a; 中小企業選擇SEO服務常陷困惑——效果難量化、承諾不透明、策略模糊化。本文剖析核心痛點&#xff0c;拆解技術合規性、策略透明度、行業經驗匹配度等關鍵篩選維度&#xff0c;提供一套清晰的評估路徑&#xff0c;助您在復雜市場中找到真正專業的合作伙伴…

在教育領域中,如何通過用戶ID跑馬燈來對視頻進行加密?

文章目錄前言一、什么是用戶跑馬燈二、用代碼如何實現用戶ID跑馬燈的功能三、如何通過用戶ID跑馬燈來對視頻進行加密&#xff1f;總結前言 在教育領域&#xff0c;優質視頻課程易遭非法傳播。為強化版權保護與責任追溯&#xff0c;引入基于用戶ID的跑馬燈水印技術成為有效手段…

MCP協議:AI時代的“萬能插座”如何重構IT生態與未來

MCP協議&#xff1a;AI時代的“萬能插座”如何重構IT生態與未來 在人工智能技術爆炸式發展的浪潮中&#xff0c;一個名為Model Context Protocol&#xff08;MCP&#xff09; 的技術協議正以驚人的速度重塑IT行業的底層邏輯。2024年11月由Anthropic首次發布&#xff0c;MCP在短…

同步,異步復位問題

1.同步復位的基本原理是&#xff0c;復位信號僅在時鐘的有效邊沿影響或重置觸發器的狀態。復位的主要目標之一是使 ASIC 在仿真時進入已知狀態。由于復位樹的扇出較大&#xff0c;復位信號相對于時鐘周期可能成為 “晚到信號”。即使復位信號會通過復位緩沖樹進行緩沖&#xff…

數組和指針回顧,練習與解析

代碼見&#xff1a;登錄 - Gitee.com 1.數組和指針練習與解析 1.1數組名 1.sizeof(數組名)&#xff0c;這里的數組名表示整個數組&#xff0c;計算的是整個數組的大小。 2.&數組名&#xff0c;這里的數組名表示整個數組&#xff0c;取出的是整個數組的地址。 3.除此之…

【牛客刷題】活動安排

文章目錄一、題目介紹二、解題思路2.1 核心問題2.2 貪心策略2.3 正確性證明三、算法分析3.1 為什么按結束時間排序&#xff1f;3.2 復雜度分析3.3 算法流程圖解3.3.1 流程圖說明3.3.2 關鍵步驟說明四、模擬演練五、完整代碼一、題目介紹 活動安排 題目描述 給定 nnn 個活動&am…

第1講:C語言常見概念

目錄 一、什么是C語言&#xff1f; 二、C語言的歷史與成就 三、編譯器選擇&#xff08;VS2022&#xff09; 1、編譯與鏈接 2、編譯器對比 3、VS2022的優缺點 四、VS項目與源文件、頭文件介紹 五、第一個C語言程序 六、main函數 七、printf和庫函數 八、關鍵字介紹 …

WinUI3入門18:從APP打開商店鏈接以及實現內購

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的&#xff0c;可以在任何平臺上使用。 源碼指引&#xff1a;github源…

BI布局拖拽 (1) 深入react-gird-layout源碼

因為有個拖拉拽的需求&#xff0c;類似于quickBi那樣的效果。在網上調研了一下發現react-grid-layout實現效果類似&#xff0c;但其也有局限性&#xff0c;比如不支持嵌套&#xff0c;不支持在多個gridLyaout之間互相拖拽。 要求&#xff1a;基于react-grid-layout的思路&#…

CentOS環境搭建-快速升級G++版本

在CentOS環境中快速升級G編譯器版本&#xff0c;對于追求最新語言特性的開發者來說至關重要。由于CentOS默認的軟件倉庫可能不提供G的最新版本&#xff0c;我們通常需要借助第三方軟件源&#xff0c;如Developer Toolset或使用Spack等包管理器來完成這一任務。下面將詳細介紹兩…

分布式接口冪等性的演進和最佳實踐,含springBoot 實現(Java版本)

一、背景&#xff1a;為什么需要冪等性 在微服務、分布式架構下&#xff0c;網絡不可靠、請求重試機制&#xff08;如前端超時重發、客戶端重發、網關重試、消息消費失敗重試等&#xff09;會帶來重復請求&#xff0c;如果接口沒有冪等性&#xff0c;可能導致&#xff1a; 重復…

OGRE 3D----6. 背景圖片渲染實現詳解

1. 背景圖片渲染原理 1.1 渲染隊列機制 Ogre3D 使用渲染隊列(Render Queue)來控制對象的渲染順序。背景圖片需要在所有其他對象之前渲染,因此我們將其設置為 RENDER_QUEUE_BACKGROUND。 1.2 視圖變換控制 為了讓背景圖片始終保持在場景的最遠處,我們需要: 使用單位投影…

K線連續漲跌統計與分析工具

K線連續漲跌統計與分析工具 1. 概述 本工具是一個用于分析金融時間序列數據(特別是K線數據)的Python腳本,主要功能是統計連續n根同方向K線后,第n+1根K線的漲跌情況。該工具不僅提供統計分析功能,還支持圖形化標記以驗證結果,幫助交易者和量化分析師識別市場中的特定模式…

jQuery EasyUI 簡介

jQuery EasyUI 簡介 引言 隨著互聯網技術的飛速發展,前端開發變得越來越重要。jQuery EasyUI 作為一款流行的前端UI框架,極大地簡化了前端開發的工作流程,提高了開發效率。本文將詳細介紹 jQuery EasyUI 的起源、特點、使用方法以及在實際項目中的應用。 一、jQuery Easy…

《測試開發:從技術角度提升測試效率與質量》

測試開發的核心工作內容與職責解析 一、測試開發的定位與核心價值 測試開發&#xff08;Test Development&#xff0c;簡稱 TestDev 或 SDET&#xff09;是融合軟件開發能力與測試工程思維的復合型崗位&#xff0c;不同于傳統測試工程師&#xff0c;其核心目標是通過技術手段提…

20250710解決KickPi的K7開發板刷機之后出現DDR異常:ch:1 dq0 fail,write:0x1,read:0x20300

20250710解決KickPi的K7開發板刷機之后出現DDR異常&#xff1a;ch:1 dq0 fail,write:0x1,read:0x20300 2025/7/10 20:36[BEGIN] 2025/7/10 19:29:03 /DDR 2f85f4b2d4 cym 25/03/04-14:38.55,fwver: v1.09 In ch0 ttot10 ch0 ttot10 ch1 ttot10 ch0 ttot18 LPDDR4, 2112MHz chan…

Ansible:強大的自動部署工具

文章目錄零、Ansible介紹一、安裝 ansible二、配置SSH密鑰1.檢查密鑰是否存在2.兩邊的機器要互相有對方的密鑰三、自動部署1.傳輸文件(1)inventory.ini(2)sync_blt.yml(3)執行命令2.安裝軟件(1)inventory.ini(2)install_efvs.yml(3)執行命令零、Ansible介紹 Ansible 是一個開源…

Nacos的基本功能以及使用Feign進行微服務間的通信

Nacos是Dynamic Naming and Configuration Service的縮寫。What’s Nacos? 下面結合SpringBoot項目&#xff0c;為你介紹Nacos的基本功能以及如何使用Feign進行微服務間的通信。 一、Nacos的基本功能 Nacos是阿里巴巴開源的一個更易于構建云原生應用的動態服務發現、配置管…

C1編譯器和C2編譯器Test01

在HotSpot VM中內嵌有兩個JIT編譯器&#xff0c;分別為Client Compiler和Server Compiler&#xff0c;通常簡稱為C1編譯器和C2編譯器。開發人員可以通過如下命令顯式指定JVM在運行時到底使用哪一種即時編譯器。(1)-client&#xff1a;指定JVM運行在Client模式下&#xff0c;并使…