【linux高級IO(三)】初識epoll

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


Linux高級IO

  • 1. 前言
  • 2. 初識epoll
  • 3. epoll的工作原理
  • 4. epoll的優缺點
  • 5. epoll的工作模式
  • 6. ET模式和LT模式的對比
  • 7. 總結以及拓展

1. 前言

其實在select和epoll之間還夾了一個poll, 但是由于epoll過于優秀, 所以poll基本沒人使用(甚至沒有select使用的多), 這里就直接跳過poll了, epoll本質上也是一種多路轉接的實現方案

本章重點:

本篇文章著重講解epoll的概念和它的底層原理, 最后會講解epoll的兩種工作模式: ET模式和LT模式, 本篇文章沒有epoll編碼, 全是干貨概念


2. 初識epoll

在centos下的man手冊中, 對epoll是這樣介紹的: 是為處理大批量句柄而作了改進的poll, 相信聰明的你一定發現了, select和poll的編程非常麻煩, 它需要我們程序員自行維護一些數據結構, 并且還有輸入輸出型參數, 編程成本高, 并且學習成本也高. 所以有了epoll

epoll相關的三個系統調用:

在這里插入圖片描述

epoll_create, 用于創建epoll模型

在這里插入圖片描述

epoll_ctl,用于設置關心的文件描述符和關心的事件

events可以是以下幾個宏的集合:

  • EPOLLIN : 表示對應的文件描述符可以讀 (包括對端SOCKET正常關閉);
  • EPOLLOUT : 表示對應的文件描述符可以寫;
  • EPOLLPRI : 表示對應的文件描述符有緊急的數據可讀 (這里應該表示有帶外數據到來);
  • EPOLLERR : 表示對應的文件描述符發生錯誤;
  • EPOLLHUP : 表示對應的文件描述符被掛斷;
  • EPOLLET : 將EPOLL設為邊緣觸發(Edge Triggered)模式, 這是相對于水平觸發(Level Triggered)來說的.
  • EPOLLONESHOT:只監聽一次事件, 當監聽完這次事件之后, 如果還需要繼續監聽這個socket的話, 需要再次把這個socket加入到EPOLL隊列里…

在這里插入圖片描述

epoll_wait,用于等待是否有事件就緒


3. epoll的工作原理

當程序中調用epoll_create時, 會在底層創建一個eventpoll結構體, 此結構體中有兩個非常重要的字段:

  • 一顆紅黑樹的根節點指針
  • 一個隊列的頭指針

紅黑樹的用處:

紅黑樹中存放著所有正在關心的文件描述符, 當我們調用epoll_ctl設置關心事件時, 實際上會在底層的這顆紅黑樹中添加/刪除/修改節點

隊列的用處:

隊列中存放的是所有存在就緒事件的文件描述符, 當我們調用epoll_wait時, 實際上就是在等待此隊列中是否有就緒的文件描述符到來

關于epoll的幾個細節:

  1. 紅黑樹的節點是需要key值的, 而文件描述符恰好可以充當這一值
  2. 用戶只需要設置關心, 獲取結果即可, 不用再關心任何對fd和event的管理
  3. 底層只要有fd就緒, OS會自動給我構建節點, 并且插入到就緒隊列中, 上層只需不斷從就緒隊列中將數據拿走, 就完成了獲取就緒事件的任務(生產者消費者模型)

在這里插入圖片描述

struct epitem{ struct rb_node rbn;//紅黑樹節點 struct list_head rdllink;//雙向鏈表節點 struct epoll_filefd ffd; //事件句柄信息 struct eventpoll *ep; //指向其所屬的eventpoll對象 struct epoll_event event; //期待發生的事件類型 
}

當調用epoll_wait檢查是否有事件發生時,只需要檢查eventpoll對象中的rdlist雙鏈表中是否有epitem元素即可. 如果rdlist不為空,則把發生的事件復制到用戶態,同時將事件數量返回給用戶. 這個操作的時間復雜度是O(1)

總結一下, epoll的使用過程就是三部曲:

  • 調用epoll_create創建一個epoll句柄;
  • 調用epoll_ctl, 將要監控的文件描述符注冊到紅黑樹;
  • 調用epoll_wait, 等待文件描述符就緒后, 去隊列中拿;

4. epoll的優缺點

對比select的優點:

  • 接口使用方便: 雖然拆分成了三個函數, 但是反而使用起來更方便高效. 不需要每次循環都設置關注的文件描述符, 也做到了輸入輸出參數分離開
  • 數據拷貝輕量: 只在合適的時候調用 EPOLL_CTL_ADD 將文件描述符結構拷貝到內核中, 這個操作并不頻繁(而select/poll都是每次循環都要進行拷貝)
  • 事件回調機制: 避免使用遍歷, 而是使用回調函數的方式, 將就緒的文件描述符結構加入到就緒隊列中,
  • epoll_wait 返回直接訪問就緒隊列就知道哪些文件描述符就緒. 這個操作時間復雜度O(1). 即使文件描述符數目很多, 效率也不會受到影響.
  • 沒有數量限制: 文件描述符數目無上限.

正是上訴的優點,使得epoll成為了現代高并發服務器中, 使用的最多的方法, 沒有之一!


5. epoll的工作模式

epoll有兩種工作方式:

  • 水平觸發(LT模式)
  • 邊緣觸發(ET模式)

水平觸發模式講解:

想象一下你一次性買了5個快遞, 快遞員張三把快遞送到你家樓下了, 打電話讓你下來拿快遞, 但是這個時候你正在和室友開黑, 你就對快遞員說: 你等等我, 我打完這把就下來取, 張三也沒說什么, 就在樓下等你. 你終于打完了這把游戲, 現在你下去取快遞, 但是你一次性只能拿4個快遞, 還剩一個在下面, 你給快遞員張三說: 你能不能再等我一下, 我上樓后再下來取剩下的一個快遞, 張三也沒說什么, 就在樓下等你. 你不下來取, 張三就一直等你, 一直給你打電話.

這就是水平觸發模式:

在這里插入圖片描述

聰明的你也能想到, 水平觸發模型下, 效率會很低, 因為快遞員張三一直在樓下等你, 不能做其他事, 所以有了邊緣觸發來替代它

邊緣觸發模式詳解:

想象一下, 假設是李四給你送外賣, 他和張三不一樣, 他脾氣非常火爆, 你快遞到來后他給你打了個電話說: 你快遞到了, 我只等你十分鐘, 如果你不下樓取快遞, 我就把你的快遞放在路邊了, 并且我只給你打一次電話. 這個時候你會怎么辦? 當然你會選擇掛機坑隊友, 直接跑下樓取快遞, 因為你不去你的快遞可能就丟失了!

這就是邊緣觸發模型:

在這里插入圖片描述


6. ET模式和LT模式的對比

首先, 一定是ET模式更加高效.
具體表現為下面幾點:

  1. ET模式通知用戶的次數變少, 減少了從內核態到用戶態的轉換, 提高了效率
  2. ET模式會使程序員一次性將所有數據取走, 減少了拷貝的次數
  3. ET模式會倒逼程序員盡快將接收緩沖區的數據取走, 那么就可以給對方發送一個更大的接受窗口(TCP協議), 對方就可以有一個更大的滑動窗口, 一次性給我們發送更多數據, 提高IO吞吐量

7. 總結以及拓展

本篇文章是epoll的理論知識, 后面會帶大家實踐編寫代碼, 如果你對epoll感興趣, 你可以去了解一下reactor模式, 也稱為反應堆模式, 很多大型框架的底層都是通過reactor來提高服務器效率的!


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

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

相關文章

STM32 HRTIM生成PWM時遇到無法輸出PWM脈沖波形問題

在使用HRTIM生成PWM時,當把周期寄存器更新的設置放到while循環中時,無法輸出PWM脈沖波形,即使增加計數延時也無法輸出,最終只能放到中斷函數中執行后期寄存器值更新才能夠生成PWM脈沖波形。

主流大數據調度工具DolphinScheduler之數據ETL流程

今天給大家分享主流大數據調度工具DolphinScheduler,以及數據的ETL流程。 一:調度工具DS 主流大數據調度工具DolphinScheduler, 其定位:解決數據處理流程中錯綜復雜的依賴關系 任務支持類型:支持傳統的shell任務&a…

Python學習4---迭代器和生成器的區別

一、迭代器 定義:迭代器是一個可以記住遍歷的位置的對象。迭代器對象必須實現兩個方法,iter() 和 next()。字符串、列表或元組等數據類型都是可迭代對象,但它們不是迭代器,因為它們不具有 next() 方法。迭代器對象用于遍歷可迭代對…

冷卻塔由那些配件組成

1、淋水填料 將需要冷卻的水(熱水)多次濺灑成水滴或形成水膜,以增加水和空氣的接觸面積和時間,促進水和空氣的熱交換。 填料在開式橫流冷卻塔的作用是增加循環水與空氣的接觸面積,并延長冷卻水停留在空氣中的時間&am…

LabVIEW工業設備姿態監測系統

開發了一種基于LabVIEW的工業設備姿態監測系統,針對現有監測設備在適應性和反應時間上的不足,采用了LabVIEW軟件和STM32微控制器,通過高精度姿態傳感器實現了對設備姿態的快速準確監測,大大提高了工業作業的安全與效率。 項目背景…

C++深度解析教程筆記9-靜態成員變量,靜態成員函數,二階構造,友元,函數重載,操作符重載

C深度解析教程筆記9 第25課 - 類的靜態成員變量實驗-數對象個數(失敗)實驗-靜態變量小結 第26課 - 類的靜態成員函數實驗-修改對象的靜態變量數值實驗-利用靜態成員函數實驗-靜態變量靜態函數實現統計對象個數小結 第27課 - 二階構造模式實驗-初始化是否…

百度人臉識別Windows C++離線sdk C#接入

百度人臉識別Windows C離線sdk C#接入 目錄 說明 設計背景 ? 場景特點: ? 客戶特點: ? 核心需求: SDK 包結構 效果 代碼 說明 自己根據SDK封裝了動態庫,然后C#調用。 功能接口 設計背景 ? 場景特點: -…

【滲透入門】XSS

文章目錄 XSS漏洞XSS舉例XSS類型防御方式 XSS漏洞 XSS(Cross-Site Scripting,跨站腳本攻擊)是一種常見的Web應用程序安全漏洞。XSS漏洞發生在應用程序未能充分過濾用戶提供的數據,使得惡意腳本得以在不知情的用戶的瀏覽器中被執行…

ARFoundation系列講解 - 91 Immersal 簡介

一、Immersal 簡介 Immersal是一家專注于增強現實(AR)技術的公司,致力于開發和推廣空間感知解決方案(簡稱:大空間技術)。他們的核心產品是一個名為Immersal SDK的開發工具包,通過視覺定位(VPS)能夠輕松地在現實世界中實現高精度的定位和增強現實體驗。 二、Immersal …

Spring Boot集成Knife4j:實現高效API文檔管理

Spring Boot集成Knife4j:實現高效API文檔管理 在軟件開發過程中,編寫和維護接口文檔是一項必不可少的任務。隨著微服務架構的流行,API文檔的重要性日益凸顯。然而,傳統的手動編寫文檔方式不僅效率低下,而且容易出錯。…

支持前端路由權限和后端接口權限的企業管理系統模版

一、技術棧 前端:iview-admin vue 后端:springboot shiro 二、基于角色的權限控制 1、路由權限 即不同角色的路由訪問控制 2、菜單權限 即不同角色的菜單列表展示 3、按鈕權限 即不同角色的按鈕展示 4、接口權限 即不同角色的接口訪問控制 三…

數字化時代的生產革新:數字孿生平臺如何助力新質生產力

一.新質生產力 在當今快速發展的科技和信息時代,企業和組織在提高生產效率和質量方面面臨著越來越多的挑戰和機遇。新質生產力的概念應運而生,強調通過創新和技術進步,不僅提升生產的數量和速度,更重要的是優化生產方式、改善產品…

leetcode熱題100.分割等和子集(動態規劃)

分割等和子集 Problem: 416. 分割等和子集 思路 我選擇使用動態規劃的方法來解題。我們需要判斷是否可以將數組分割成兩個子集,使得這兩個子集的和相等。這個問題可以轉化為在數組中找到一個子集,使得其和等于數組總和的一半。 解題過程 首先&#xf…

消息隊列-RocketMQ

消息隊列-RocketMQ 1、RocketMQ是什么?2、RocketMQ有什么優缺點?3、消息隊列主要有哪幾種消息模型?4、RocketMQ主要使用哪種消息模型?5、RocketMQ的基本架構是怎樣的?有哪些核心組件?6、RocketMQ通過什么方式保證消息的可用性和可靠性?7、什么情況下會發生消息丟失?Roc…

設計模式大白話之裝飾者模式

想象一下,你走進一家咖啡館,點了一杯美式咖啡。但是,你可能還想根據自己的口味添加一些東西,比如奶泡、巧克力粉、焦糖醬或是肉桂粉。每次你添加一種配料,你的咖啡就會變得更豐富,同時價格也會相應增加。 在…

圖——圖的應用02最短路徑(Dijkstra算法與Floyd算法詳解),拓撲排序及關鍵路徑

前面介紹了圖的應用——01最小生成樹章節,大家可以通過下面的鏈接學習: 圖——圖的應用01最小生成樹(Prim算法與Kruskal算法詳解) 今天就講一下圖的其他應用——最短路徑,拓撲排序及關鍵路徑。 目錄 一&#xff0c…

HG/T 3655-2024 紫外光UV固化木器涂料檢測

紫外光UV固化木器涂料是指由活性低聚物、活性稀釋劑、光引發劑和其他成分組成的水性、非水性紫外光固化木器涂料,主要用于室內用木質地板、家具、裝飾板等木器的裝飾與保護。 HG/T 3655-2024紫外光UV固化木器涂料檢測項目: 測試指標 測試方法 在容器中…

成都亞恒豐創教育科技有限公司 【插畫猴子:筆尖下的靈動世界】

在浩瀚的藝術海洋中,每一種創作形式都是人類情感與想象力的獨特表達。而插畫,作為這一廣闊領域中的璀璨明珠,以其獨特的視覺語言和豐富的敘事能力,構建了一個又一個令人遐想連篇的夢幻空間。成都亞恒豐創教育科技有限公司 在眾多插…

MYSQL設計索引一般需要考慮哪些因素?

在設計MySQL索引時,確實需要綜合考慮多個因素以確保索引的有效性和性能優化。以下是您提到的參考思路的詳細擴展: 1. 數據量 數據量大小:通常,當表中的數據量超過一定閾值(如幾百條記錄)時,創…

Linux——進程概念詳解

一、進程的基本概念 在給進程下定義之前,我們先了解一下進程: 我們在編寫完代碼并運行起來時,在我們的磁盤中會形成一個可執行文件,當我們雙擊這個可執行文件時(程序時),這個程序會加載到內存…