IO多路復用技術、select、poll、epoll聯系與區別

目錄

  • IO多路復用技術
    • select:
    • poll:
    • epoll(Linux特有):
  • epoll select poll的區別
  • epoll是同步還是異步
  • epoll詳解

IO多路復用技術

  • 通信雙方都有一個socket,以一個文件描述符的形式存在,那這個fd也對應了內核當中的一塊緩存區,緩沖區里有讀緩沖區和寫緩沖區,一端寫另一端讀,IO也就是指這樣對緩沖區的操作多路復用能夠讓程序同時監聽多個文件描述符

I/O多路復用技術是一種允許單個進程或線程同時監視多個輸入/輸出(I/O)通道的技術,如網絡連接、文件描述符等。當某個I/O通道有數據可讀或可寫時,操作系統通知應用程序進行相應的操作。這種技術可以提高應用程序的效率和性能,特別是在處理大量并發I/O操作時。以下是幾種常見的I/O多路復用技術:

select:

select是最早的I/O多路復用技術之一。它允許程序指定一組文件描述符,然后查詢這些描述符中哪些已經準備好進行讀取或寫入操作。

poll:

poll與select類似,但它使用不同的數據結構(pollfd結構體數組),并且沒有select中的文件描述符數量限制。

epoll(Linux特有):

epoll是Linux下的一種高效的I/O多路復用技術。它使用一組系統調用(epoll_create、epoll_ctl、epoll_wait)來管理事件和通知機制。epoll使用紅黑樹和事件列表來提高性能,特別是對于大量并發連接。

epoll select poll的區別

select/poll/epoll 都是內核提供給用戶態的多路復用系統調用

  1. select和poll要檢測的文件描述符集合是在用戶態下創建的,每次調用都需要從用戶態拷貝到內核中。而epoll從創建開始就是在內核空間創建的。
  2. 判斷是否有文件描述符就緒,select和poll需要遍歷整個文件描述符的集合,遍歷的時間復雜度都是O(n)。而epoll利用了內核的事件驅動機制,只有當文件描述符就緒時才會返回,在硬件的支持下是O(1)的時間復雜度。
  3. select和poll都只能工作在相對低效的LT模式下,而epoll同時支持LT和ET模式。
  • 水平觸發:當文件描述符就緒時,它們會一直通知應用程序直到應用程序處理完該事件
  • 邊緣觸發:它只會通知應用程序一次,所以我們一般會循環的從文件描述符中讀寫數據,一次性盡可能多的讀取數據。
  • 一般來說,邊緣觸發的效率比水平觸發的效率要高,因為邊緣觸發可以減少系統調用次數,減少開銷的。
  • 當監測的fd數量較小,建議使用select和poll;當監聽的fd數量較多,使用epoll會明顯提升性能。
  • epoll 在內核里使用「紅黑樹」來關注進程所有待檢測的 Socket

epoll是同步還是異步

epoll 通常被認為是一種介于傳統同步 I/O 和完全異步 I/O 之間的機制。
同步的:epoll 通過 epoll_wait() 系統調用來通知應用程序哪些文件描述符已經準備就緒,應用程序在接收到通知后就要自己去執行實際的 I/O 操作。這種模式更接近于同步 I/O。
異步的:epoll 允許應用程序先注冊對特定的 I/O 事件,當這些事件發生之后操作系統會自動通知應用程序,這是異步 I/O 的一個關鍵特征。
所以總體而言它是同步的,但又提供了一種接近異步 I/O 的編程模型。

epoll詳解

epoll 是 Linux 內核提供的一種高效的 I/O 多路復用技術,用于監控大量文件描述符(file descriptors)的 I/O 事件。與傳統的 select 和 poll 相比,epoll 在處理大量并發連接時具有顯著的性能優勢。以下是 epoll 的一些關鍵特性和概念:

數據結構:

epoll 使用紅黑樹來組織和管理文件描述符,這使得查找、添加和刪除操作都非常高效。
系統調用:

epoll 提供了三個主要的系統調用:
epoll_create:創建一個新的 epoll 實例。
epoll_ctl:用于添加(EPOLL_CTL_ADD)、修改(EPOLL_CTL_MOD)或刪除(EPOLL_CTL_DEL)感興趣的文件描述符。
epoll_wait:等待 I/O 事件的發生,并返回就緒的文件描述符列表。
事件類型:

epoll 支持多種類型的事件,包括讀(EPOLLIN)、寫(EPOLLOUT)、錯誤(EPOLLERR)等。
事件觸發模式:

epoll 支持兩種觸發模式:
邊緣觸發(Edge Triggered,ET):只有狀態發生變化時才通知應用程序。
水平觸發(Level Triggered,LT):只要條件滿足,就會不斷通知應用程序。
性能優勢:

與 select 和 poll 不同,epoll 不需要在每次調用時傳遞所有文件描述符的集合,內核維護了文件描述符的狀態,這大大減少了數據復制的開銷。
就緒列表:

當 epoll_wait 被調用時,內核會將準備好的文件描述符添加到就緒列表中,應用程序可以直接從這個列表中讀取事件,而不需要輪詢。
可擴展性:

epoll 可以高效地處理成千上萬的并發連接,這使得它非常適合用于高性能的服務器應用程序。
內存使用:

盡管 epoll 在性能上優于 select 和 poll,但它可能會使用更多的內存,特別是當監控大量文件描述符時。
編程復雜性:

使用 epoll 編程可能比 select 和 poll 更復雜,需要正確地管理文件描述符的注冊、注銷和事件處理。
epoll 的高效性能使其成為 Linux 下開發高性能網絡應用程序的首選 I/O 多路復用技術之一。然而,開發者需要仔細設計程序,以充分利用 epoll 的優勢,同時避免潛在的編程陷阱。

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

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

相關文章

AI 大事件:超級明星 Andrej Karpathy 創立AI教育公司 Eureka Labs

🧠 AI 大事件:超級明星 Andrej Karpathy 創立AI教育公司 Eureka Labs 摘要 Andrej Karpathy 作為前 OpenAI 聯合創始人、Tesla AI 團隊負責人,他的專業性和實力備受矚目。Karpathy 對 AI 的普及和教育充滿熱情,從 YouTube 教程到…

CBSD bhyve Ubuntu 配置vnc登錄管理

CBSD介紹 CBSD是為FreeBSD jail子系統、bhyve、QEMU/NVMM和Xen編寫的管理層。該項目定位為一個綜合解決方案的單一集成工具,用于使用預定義的軟件集以最少的配置快速構建和部署計算機虛擬環境。 雖然CBSD沒有提供額外的操作系統級功能,但它極大地簡化了…

兩年經驗前端帶你重學前端框架必會的ajax+node.js+webpack+git等技術 Day1

黑馬程序員前端AJAX入門到實戰全套教程,包含學前端框架必會的(ajaxnode.jswebpackgit),一套全覆蓋 Day1 你好,我是Qiuner. 為幫助別人少走彎路和記錄自己編程學習過程而寫博客 這是我的 github https://github.com/Qiuner ?? ?…

【算法/天梯賽訓練】天梯賽模擬題集

L1-009 N個數求和 #include <iostream> #include <algorithm>using namespace std;typedef long long ll; const int N 105;typedef struct node {ll x, y; }node; node a[N];ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a; }int main() {int n;cin >>…

《昇思25天學習打卡營第25天|第9天》

今天是打卡的第九天&#xff0c;今天學習的是使用靜態圖加速這門課程&#xff0c;從他的背景學起&#xff1a;AI編譯框架分為兩種運行模式&#xff0c;分別是動態圖模式和靜態圖模式&#xff0c;動態圖模式特點&#xff1a;計算圖的構建和計算同時發生&#xff0c;缺點&#xf…

Qt Style Sheets-樣式表語法

樣式表語法 Qt 樣式表術語和語法規則幾乎與 HTML CSS 的相同。如果您已經了解 CSS&#xff0c;您可能可以快速瀏覽此部分。 樣式規則 樣式表由一系列樣式規則組成。樣式規則由選擇器和聲明組成。選擇器指定哪些小部件受該規則影響&#xff1b;聲明指定應在小部件上設置哪些屬性…

ThinkPHP6事件系統使用指南

本文由 ChatMoney團隊出品 在ThinkPHP 6中&#xff0c;事件系統提供了一種優雅的方式來實現解耦和動態響應。你可以通過注冊事件和對應的監聽者來處理各種應用邏輯。 事件注冊 閉包注冊 閉包是最簡單的事件監聽者&#xff0c;可以直接在注冊時定義。 Event::listen("C…

Linux操作系統之多文件管理

makefile: makefile文件用于管理和組織代碼工程的編譯和鏈接,被make工具解析并完成相關動作 make: 工程管理工具 語法: 要生成的文件:依賴的所有文件 時間戳: 編譯文件時,時間戳更新的文件需要重新加入編譯,時間戳沒有改變的不需要重新編譯 app:main.c add.c sub.c …

如何追查一個packet在linux 系統哪里丟失

要想追一個包在系統哪里丟失了&#xff0c; 就要了解 一個應用層的包在送出時 要經歷那些 檢查點 和被丟掉的點。 1. 在傳輸層&#xff0c;如果是 tcp 包 會有contrack 的 buf 的限制 可能會導致 packets 的丟失。 > 檢查辦法&#xff1a;查看dmesg日志有報錯&#xff1a;k…

MySQL數據庫慢查詢日志、SQL分析、數據庫診斷

1 數據庫調優維度 業務需求&#xff1a;勇敢地對不合理的需求說不系統架構&#xff1a;做架構設計的時候&#xff0c;應充分考慮業務的實際情況&#xff0c;考慮好數據庫的各種選擇(讀寫分離?高可用?實例個數?分庫分表?用什么數據庫?)SQL及索引&#xff1a;根據需求編寫良…

C# 實體更新記錄:如何捕獲和記錄字段變化到日志

方案一&#xff1a;粗糙但可用 var changes new List<string>();void CompareAndAddChange<T>(string propertyName, T oldValue, T newValue, Func<T, string> descriptionFunc null) {if (!EqualityComparer<T>.Default.Equals(oldValue, newVa…

分支定界法(Branch and Bound, 簡稱BB)是一種求解整數規劃問題的有效算法。

分支定界法&#xff08;Branch and Bound&#xff09;詳解與Python代碼示例 分支定界法概述 分支定界法&#xff08;Branch and Bound, 簡稱B&B&#xff09;是一種求解整數規劃問題的有效算法。它結合了搜索與迭代的思想&#xff0c;通過系統地枚舉候選解來尋找最優解。在…

Java Web常見框架尋找路由技巧

在Java Web代碼審計中&#xff0c;尋找和識別路由是很關鍵的部分。通過注冊的路由可以找到當前應用對應的Controller&#xff0c;其作為MVC架構中的一個組件&#xff0c;可以說是每個用戶交互的入口點。簡單介紹下Java Web中常見框架&#xff08;Spring Web、Jersey&#xff09…

【SASS/SCSS(二)】模塊化語法

目錄 一、use 1、命名空間 2、私有變量 3、用with改變模塊中的默認值 二、forward 1、給forward模塊起別名&#xff0c;讓成員加前綴 2、利用hide or show手動控制成員的可訪問性 三、import 1、不存在命名空間&#xff0c;成員變量在import之后直接公開 2、可以在嵌…

springboot防止重復提交的方案有哪些

在Spring Boot中&#xff0c;防止接口或表單重復提交有多種策略&#xff0c;以下是幾種常見且有效的方案&#xff1a; 前端控制&#xff1a; 禁用提交按鈕&#xff1a;在表單提交后&#xff0c;使用JavaScript立即禁用提交按鈕&#xff0c;防止用戶再次點擊。響應式提示&#x…

十、Java集合 ★ ?(模塊18-20)【泛型、通配符、List、Set、TreeSet、自然排序和比較器排序、Collections、可變參數、Map】

day05 泛型,數據結構,List,Set 今日目標 泛型使用 數據結構 List Set 1 泛型 1.1 泛型的介紹 ★ 泛型是一種類型參數&#xff0c;專門用來保存類型用的 最早接觸泛型是在ArrayList&#xff0c;這個E就是所謂的泛型了。使用ArrayList時&#xff0c;只要給E指定某一個類型…

講真,現在留給2024年下半年軟考的時間還夠嗎?

常識是個好東西&#xff0c;但是有時候卻容易蒙蔽咱們的雙眼&#xff0c;就拿下半年軟考而言&#xff0c;看起來現在才7月份&#xff0c;剛剛入伏&#xff0c;考試要到11月份&#xff0c;是冬天呢&#xff0c;中間還隔了一個完整的秋季&#xff0c;常識感覺還很遙遠&#xff0c…

【Vue3】4個比較重要的設計模式!!

大家好,我是CodeQi! 一位熱衷于技術分享的碼仔。 在我投身于前端開發的職業生涯期間,曾有一次承接了一個大型項目的維護工作。此項目運用的是 Vue 框架,然而其代碼結構紊亂不堪,可維護性極度糟糕??。 這使我深刻領會到,理解并運用 Vue 中的重要設計模式是何等關鍵! …

對LinkedList ,單鏈表和雙鏈表的理解

一.ArrayList的缺陷 二.鏈表 三.鏈表部分相關oj面試題 四.LinkedList的模擬實現 五.LinkedList的使用 六.ArrayList和LinkedList的區別 一.ArrayList的缺陷: 1. ArrayList底層使用 數組 來存儲元素&#xff0c;如果不熟悉可以來再看看&#xff1a; ArrayList與順序表-CSDN…

一些常見的網絡故障

&#x1f4d1;打牌 &#xff1a; da pai ge的個人主頁 &#x1f324;?個人專欄 &#xff1a; da pai ge的博客專欄 ??寶劍鋒從磨礪出&#xff0c;梅花香自苦寒來 ??運維工程師的職責&#xff1a;監…