【linux高級IO(一)】理解五種IO模型

💓博主CSDN主頁:杭電碼農-NEO💓
?
?專欄分類:Linux從入門到精通?
?
🚚代碼倉庫:NEO的學習日記🚚
?
🌹關注我🫵帶你學更多操作系統知識
? 🔝🔝


在這里插入圖片描述

Linux高級IO

  • 1. 前言
  • 2. 重談對IO的理解
  • 3. 阻塞IO講解
  • 4. 非阻塞IO講解
  • 5. 信號驅動IO
  • 6. IO多路轉接
  • 7. 異步IO
  • 8. 理解異步和同步
  • 9. 總結以及拓展

1. 前言

本篇文章開始, 將與大家分享高級IO相關的內容
本章重點:

本篇文章會帶大家初識五種常見的IO模型, 分別是: 阻塞IO, 非阻塞IO, 信號驅動IO, IO多路轉接, 異步IO. 其中, 多路轉接將會是本系列文章后續的重點


2. 重談對IO的理解

IO: input or output --> 訪問外設 效率低
IO一定是非常低效的, 以讀取為例:

當我們read/recv時, 如果底層緩沖區沒有數據, read/recv函數會阻塞
當我們read/recv時, 如果底層緩沖區有數據, read/recv函數會拷貝

所以說, IO = 等待 + 拷貝 !!!

記住這句話, 會一直貫穿整個IO系列文章

探討低效IO和高效IO:

很明顯, IO = 等待 + 拷貝.
所以可以得出下面的結論:

  • 低效IO: 單位時間內, 大部分時間, IO類接口都在等待
  • 高效IO: 讓等待的比重降低

接下來的五種IO模型, 就是圍繞著是否高效進行的


3. 阻塞IO講解

正如其名, 阻塞IO 在內核將數據準備好之前, 系統調用會一直等待, 并且所有的套接字默認都是阻塞IO. 阻塞IO是最常見的IO模型, 它比較好理解, 下面是關于阻塞IO的圖像講解

在這里插入圖片描述

通俗來講, 阻塞IO就是, 你去河邊釣魚, 只拿一根魚竿等于上鉤, 并且時刻盯著水面


4. 非阻塞IO講解

顧名思義, 非阻塞IO就是說, 當底層數據沒有準備就緒時, 不會傻傻的等待, 而是直接返回. 但是調用recv時, 出現錯誤也會直接返回, 應該怎樣區分這兩種情況呢? 答案是阻塞式IO的正常返回時, 會將errno全局遍歷設置為宏: EWOULDBLOCK. 這下就能將它們區分開了

在這里插入圖片描述

非阻塞IO往往需要程序員循環的方式反復嘗試讀寫文件描述符, 這個過程稱為輪詢. 這對CPU來說是較大的浪費, 一般只有特定場景下才使用. 下面是非阻塞IO的簡單示例:

#include <fcntl.h>
#include <unistd.h>
#include<errno.h>
#include <cstdlib>
#include <iostream>
using namespace std;//對指定的fd設置非阻塞
void SetNonBlock(int fd) {int fl = fcntl(fd, F_GETFL);if (fl < 0) {cerr << "fcntl error" << endl;exit(1);}fcntl(fd, F_SETFL, fl | O_NONBLOCK);
}int main() {SetNonBlock(0);while (1) {char buffer[1024];ssize_t s = read(0, buffer, sizeof(buffer) - 1);if (s > 0) {buffer[s] = 0;cout << buffer << endl;} else if (s == 0) {cout << "讀到文件結尾了" << endl;break;}else{//1. 數據沒用準備好 2. 真的出錯了. 都以-1的返回值返回// 數據沒有準備好,不算出錯. 需要區分這兩種情況if(errno == EWOULDBLOCK || errno == EAGAIN){cout<<"os底層數據還沒就緒"<<endl;cout<<errno<<endl;}//被信號中斷, 也不算read出錯else if(errno == EINTR){cout<<"IO interrupted by signal"<<endl;}else{cout<<"read error"<<endl;break;}}sleep(1);}
}

調用fcntl函數將fd設置為非阻塞

通俗來講, 非阻塞IO就是, 你去河邊釣魚, 也只用一根魚竿, 但是你過一分鐘才去看看有沒有魚上鉤, 其他時間你可能在刷抖音


5. 信號驅動IO

信號驅動IO: 內核將數據準備好的時候, 使用SIGIO信號通知應用程序進行IO操作. 也就是說信號驅動的方式你不用像非阻塞IO一樣, 每過一段時間去檢查是否有數據就緒, 一旦有數據就緒, 會有信號通知你, 這也就可以更多時間刷抖音了(不是)

在這里插入圖片描述

通俗來講, 信號驅動IO就是, 你去河邊釣魚, 也只拿一個魚竿, 只不過魚竿上有壓力傳感器, 一旦有魚上鉤就會發出聲音提醒你. 其余時間我們當然可以愉快的刷抖音


6. IO多路轉接

前面幾個釣魚的人是不是有點寒酸了?一次只拿一個魚竿, 效率太低了吧! 多路轉接直接把桌子掀了, 它拿了100個魚竿去釣魚: IO多路轉接能夠同時等待多個文件描述符的就緒狀態

在這里插入圖片描述

通俗來說就是你拿一百個魚竿去釣魚, 同時等待一百種可能, 一旦有魚上鉤了, 會同時把所有上鉤的魚都拉上來, 這效率簡直是指數級增長, 所以這也是在實際生活中使用的最多的IO方案


7. 異步IO

前面所有的IO方式, 都是同步IO, IO=等待+拷貝, 同步IO就是要么參與了等待過程, 要么參與了拷貝過程, 要么都參與了. 而異步IO則是等待和拷貝都不參與: 由內核在數據拷貝完成時, 通知應用程序(而信號驅動是告訴應用程序何時可以開始拷貝數據).

在這里插入圖片描述

還是拿釣魚的例子來說, 前面的釣魚者, 不管你一次性帶多少魚竿(多路轉接), 不管你在魚竿上安裝什么高科技(信號驅動), 但是你總得去河邊, 自己拿著魚竿釣魚. 而異步IO是怎么做的呢? 他直接雇傭了一個人幫它去釣魚, 什么時候魚上鉤, 你等待了多久我都不在乎, 我只需要你在晚上九點的時候將釣的魚全部帶給我即可.


8. 理解異步和同步

同步和異步關注的是消息通信機制.

在這里插入圖片描述

同步和異步在實際場景中怎樣運用?

雖然說大部分IO類型都是同步IO, 但是實際生活中運用異步IO的概率也不小. 舉個例子, 你是王者榮耀的后端, 一個英雄放了一個技能打在對面身上, 此時我們后端要將這個操作做成同步的還是異步的? 很明顯是同步, 因為我想要實時的看見對面英雄的血條在減少. 再舉個例子, 現在你是QQ的后端, 你現在要查詢一千萬個QQ號中, 有哪些QQ號超過1個月沒有上線了. 你把此功能做成同步還是異步? 很明顯考慮到成本問題一定是做成異步, 一千萬個QQ號如果用一臺機器可能會查詢幾個小時, 你可能會說, 那我可以用多臺機器做負載均衡, 是的沒錯, 但是機器數量多了, 成本就上去了. 所以做成異步的IO比較好

綜上所述, 實際場景中要根據自己的情況和需求來覺得使用同步還是異步, 不要覺得在學習時都用同步, 以后工作了也就無腦的用同步


9. 總結以及拓展

本篇文章只是簡單的介紹了IO模型的幾個分類, 其中, 最重要的模型是多路轉接, 后面的文章會著重講解它. 多路轉接為什么重要? 因為它是業內最常用的用來提高并發性的模型, 后續大家都接觸都reactor模型, 而reactor模型可以有多種實現方式, 而效率最高的reactor模型則是用多路轉接實現的!!!


🔎 下期預告:多路轉接之select 🔍

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

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

相關文章

kubernetes dashboard安裝

1.查看符合自己版本的kubernetes Dashboard 比如我使用的是1.23.0版本 https://github.com/kubernetes/dashboard/releases?page5 對應版本 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml修改對應的yaml,…

Linux Conda 入門案例教程

Conda 的基本概念 1.什么是 Conda&#xff1f;&#xff1a;Conda 是一個開源的包管理器和環境管理器&#xff0c;用于管理 Python 和其他語言的環境和依賴項。 2.Conda 的特點&#xff1a;Conda 的特點包括快速、可靠、靈活和跨平臺支持等。 安裝和配置 1.安裝 Conda&#x…

adb不插usb線通過wifi調試

說起做手機開發也有好多年了&#xff0c;說來慚愧&#xff0c;我最近才知道安卓手機是可以不插數據線進行開發調試的。起因是公司近期采購了一批安卓一卡通設備&#xff0c;需要對其進行定制開發APP,但是由于我插USB調試發現沒有反應。通過詢問廠家才知道可以通過WIFI進行調試。…

請注意,以下這幾種操作都會導致流量卡被停用!

最近一段時間&#xff0c;小編經常收到一些反饋&#xff0c;明明是剛辦理的手機號還沒有用幾天就被停用了&#xff0c;今天&#xff0c;這篇文章我們要了解就是手機號被停用的問題。 ? 對于新辦理的手機號會被停用這個問題&#xff0c;主要還是因為運營商為了防止電話詐騙&…

vue監聽數據時 newValue, oldValue操作處理

要只存入新更改的數據&#xff0c;可以在 watch 的回調函數中進行比較&#xff0c;篩選出有變化的屬性并將其存入新數組。以下是一個示例代碼&#xff0c;假設要監聽的對象為 obj&#xff1a; data() {return {differenceArray: [], obj: { /* 對象的初始屬性 */ }}; }, compu…

java數據結構集合復習之包裝類和泛型

前言: 這是我最一年學習java的一部分的回顧總結 1.包裝類 在Java中&#xff0c;由于基本類型不是繼承自Object&#xff0c;為了在泛型代碼中可以支持基本類型&#xff0c;Java給每個基本類型都對應了一個包裝類型。 1.1基本數據類型和對應的包裝類 ----—基本數據類型包裝類…

ubuntu軟件源的兩種格式和環境變量

1. ubuntu的/etc是什么目錄&#xff1f; 在Ubuntu操作系統中&#xff0c;/etc/是一個特殊的目錄&#xff0c;它包含系統的配置文件。這些配置文件用于設置各種系統和應用程序的參數和選項。 一般來說&#xff0c;用戶可以在這個目錄下找到各種重要的配置文件&#xff0c;如網絡…

Web3 ETF的主要功能

Web3 ETF的主要功能可以概括為以下幾點&#xff0c;Web3 ETF仍是一項新興投資產品&#xff0c;其長期表現仍存在不確定性。投資者在投資Web3 ETF之前應仔細研究相關風險&#xff0c;并做好充分的風險評估。北京木奇移動技術有限公司&#xff0c;專業的軟件外包開發公司&#xf…

商務辦公優選!AOC Q27E3S2商用顯示器,打造卓越新體驗!

摘要&#xff1a;助辦公室一族縱橫職場&#xff0c;實現高效舒適辦公&#xff01; 在日常商務辦公中&#xff0c;對于辦公室一族來說總有太多“難難難難難點”&#xff1a;工作任務繁瑣&#xff0c;熬夜加班心力交瘁、長時間伏案工作導致頸椎、眼睛等出現問題&#xff0c;職業…

BBA車主,千萬別去試駕問界M9

文 | AUTO芯球 作者 | 雷慢&響鈴 我勸你啊&#xff0c;千萬別去試駕問界M9&#xff0c; 不然啊&#xff0c;可能1個小時50萬就沒了&#xff0c; 不信你看這個“大冤種”&#xff0c; 他曾經發誓打死不買電車&#xff0c; 考慮了三、四年換寶馬X5&#xff0c; 結果談完…

GNU/Linux - 如何編譯kernel

使用 make 命令構建 Linux 內核涉及多個步驟。下面是整個過程的基本概述&#xff1a; 1. 獲取內核源代碼 * 從 kernel.org 或你的發行版軟件倉庫下載內核源代碼。 * 將源代碼解壓縮到一個目錄中。 2. 配置內核 * 切換到內核源代碼目錄。 * 可選擇清理源代碼樹&#xff1a;mak…

前端面試題5(前端常見的加密方式)

前端常見的加密方式 在前端進行數據加密主要是為了保護用戶的隱私和提升數據傳輸的安全性。前端數據加密可以采用多種方法&#xff0c;以下是一些常見的加密技術和方法&#xff1a; 1. HTTPS 雖然不是直接的前端加密技術&#xff0c;但HTTPS是保障前端與后端數據傳輸安全的基…

關于MCU-Cortex M7的存儲結構(flash與SRAM)

MCU并沒有DDR&#xff0c;所以他把代碼存儲在flash上&#xff0c;臨時變量和棧運行在SRAM上。之所以這么做是因為MCU的cpu頻率很低&#xff0c;都是幾十MHZ到一二百MHZ&#xff0c;flash的讀取速度能夠滿足cpu 的取指需求&#xff0c;但flash 的寫入速度很慢&#xff0c;所以引…

剛辦理的手機號被停用,你可能遇到這些問題了!

很多朋友都會遇到手機號被停用的情況&#xff0c;那么你知道你的手機號為什么會被停用嗎&#xff1f;接下來&#xff0c;關于手機號被停用的問題&#xff0c;跟著小編一塊來了解一下吧。 ?停機的兩種形態&#xff1a; 1、第一個是局方停機&#xff0c;即語音、短信和流量都不…

xmind2testcase工具將測試用例從Xmind轉為CSV導入禪道

使用xmind編寫測試用例&#xff0c;使用xmind2testcase工具將測試用例從Xmind轉為CSV導入禪道&#xff0c;便于管理。 1.工具準備 第一步&#xff1a;安裝python 第二步&#xff1a;安裝xmind2testcase工具 運行-cmd-打開命令提示符彈窗&#xff0c;輸入安裝命令 安裝命令&…

意圖數據集HWU、Banking預處理

當談到意圖數據集時&#xff0c;HWU、Banking和Clinc是三個常見的數據集。以下是關于這三個數據集的介紹&#xff1a; 目錄 一、數據集介紹 HWU數據集 Banking數據集 Clinc數據集 二、數據集預處理 數據處理 數據存儲 數據類別分析 句子長度統計 一、數據集介紹 HW…

嵌入式硬件電路常用設計軟件

目錄 1. Cadence Allegro 2. PADS 3. Altium Designer 4. Multisim 5. Protues 1. Cadence Allegro 功能&#xff1a; Cadence Allegro是Cadence公司推出的先進PCB&#xff08;Printed Circuit Board&#xff0c;印刷電路板&#xff09;設計布線工具&#xff0c;也是目前…

華為HCIP Datacom H12-821 卷26

1.單選題 在VRRP中&#xff0c;同一備份組的設備在進行VRRP報文認證時&#xff0c;以下哪一參數不會影響Master設備和Backup設備認證協商結果 A、認證字 B、優先級 C、認證方式 D、VRRP版本 正確答案&#xff1a; B 解析&#xff1a; 優先級只會影響誰是主誰是備&…

AI產品經理能力模型的重點素質:人文素養和靈魂境界

在AI產品經理的能力模型中&#xff0c;我最想提的差異化關鍵點&#xff0c;就是“人文素養和靈魂境界”。 1 為什么“人文素養和靈魂境界”非常重要&#xff1f; 一、“人文素養和靈魂境界”如何影響AI產品設計&#xff1f; 例1&#xff1a;面對一個具體的AI場景&#xff0…

25考研,數二全程跟的張宇老師請問660(做了一半)880和張宇1000題應該怎么選擇?

跟張宇老師&#xff0c;也可以做其他的題集&#xff0c;不一定非要做1000題 我當初考研復習的時候&#xff0c;也聽了張宇老師的課程&#xff0c;但是我并沒有做1000題 因為1000題對于我來說太難了。做了一章之后&#xff0c;就換成其他的題目了。 對于大家來說&#xff0c;…