chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度解讀epoll 的原理

Linux愛好者 ? 來源:Linux內(nèi)核那些事 ? 作者:Linux內(nèi)核那些事 ? 2021-06-04 16:56 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

epoll 可以說是編寫高性能服務(wù)端程序必不可少的技術(shù),在介紹 epoll 之前,我們先來了解一下 多路復(fù)用I/O 吧。

多路復(fù)用I/O多路復(fù)用I/O:是指內(nèi)核負(fù)責(zé)監(jiān)聽多個(gè) I/O 流,當(dāng)任何一個(gè) I/O 流處于就緒狀態(tài)(可讀或可寫)時(shí)都會(huì)通知進(jìn)程,以便可以處理該 I/O 流上的數(shù)據(jù)。如 圖1 所示:

b158838e-c482-11eb-9e57-12bb97331649.png

如 圖1 所示,內(nèi)核負(fù)責(zé)監(jiān)聽多個(gè) I/O 流,當(dāng)某些 I/O 流變?yōu)榫途w狀態(tài),內(nèi)核會(huì)把這些 I/O 流添加到就緒隊(duì)列中,然后通知進(jìn)程處理就緒隊(duì)列中的 I/O 流。

與傳統(tǒng)的阻塞型 I/O 相比,多路復(fù)用 I/O 的優(yōu)點(diǎn)是可以同時(shí)監(jiān)聽多個(gè) I/O 流,并且會(huì)把就緒的 I/O 流告知進(jìn)程。

epoll原理介紹完多路復(fù)用 I/O,接下來開始介紹我們的主角:epoll。

Linux 系統(tǒng)中,有多種多路復(fù)用 I/O 的實(shí)現(xiàn),比如 select 和 poll 等。而 epoll 也是多路復(fù)用 I/O 一種實(shí)現(xiàn),與 select 和 poll 相比,epoll 在性能上有較大的提升。

紅黑樹

epoll 內(nèi)部使用紅黑樹來保存所有監(jiān)聽的 socket,紅黑樹是一種平衡二叉樹,添加和查找元素的時(shí)間復(fù)雜度為 O(log n),其結(jié)構(gòu)如 圖2 所示:

b1689602-c482-11eb-9e57-12bb97331649.png

epoll 通過 socket 句柄來作為 key,把 socket 保存在紅黑樹中。如 圖2 所示,每個(gè)節(jié)點(diǎn)中的數(shù)字代表著 socket 句柄。

把監(jiān)聽的 socket 保存在紅黑樹中的目的是,為了在修改監(jiān)聽 socket 的讀寫事件時(shí),能夠通過 socket 句柄快速找到對(duì)應(yīng)的 socket 對(duì)象。

就緒隊(duì)列

另外,epoll 還維護(hù)著一個(gè)就緒隊(duì)列,當(dāng) epoll 監(jiān)聽的 socket 狀態(tài)發(fā)生改變(變?yōu)榭勺x或可寫)時(shí),就會(huì)把就緒的 socket 添加到就緒隊(duì)列中。如 圖3 所示:

b172e3e6-c482-11eb-9e57-12bb97331649.png

當(dāng) socket 從網(wǎng)絡(luò)中獲取到數(shù)據(jù)后,會(huì)發(fā)生通知給 epoll,epoll 會(huì)將當(dāng)前 socket 添加到就緒隊(duì)列中,并且喚醒等待中的進(jìn)程(也就是調(diào)用 epoll_wait 的進(jìn)程)。

當(dāng) socket 狀態(tài)發(fā)生變化時(shí),會(huì)調(diào)用 ep_poll_callback 函數(shù)來通知 epoll,我們來看看這個(gè)函數(shù)的處理過程:

static int ep_poll_callback(wait_queue_t *wait, unsigned mode, int sync, void *key){ 。。. struct epitem *epi = ep_item_from_wait(wait); struct eventpoll *ep = epi-》ep; 。。. // 1) 把 socket 添加到就緒隊(duì)列中 list_add_tail(&epi-》rdllink, &ep-》rdllist);

is_linked: // 2) 喚醒調(diào)用 epoll_wait() 而被阻塞的進(jìn)程 if (waitqueue_active(&ep-》wq)) wake_up_locked(&ep-》wq); 。。. return 1;}

ep_poll_callback 函數(shù)的意圖很清晰,主要完成兩個(gè)工作:

把就緒的 socket 添加到就緒隊(duì)列中。

喚醒調(diào)用 epoll_wait 函數(shù)而被阻塞的進(jìn)程。

當(dāng)進(jìn)程被喚醒后,就會(huì)從就緒隊(duì)列中,把就緒的 socket 復(fù)制到用戶提供的數(shù)組中。如 圖4 所示:

b17fa086-c482-11eb-9e57-12bb97331649.png

如 圖4 所示,在調(diào)用 epoll_wait 時(shí)需要提供一個(gè) events 數(shù)組來存儲(chǔ)就緒的 socket。當(dāng) epoll_wait 返回后,用戶就可以從events 數(shù)組中獲取到就緒的 socket,并可對(duì)其進(jìn)行讀寫操作。

總結(jié)本文主要通過圖解的方式大概介紹了 epoll 的原理,但很多實(shí)現(xiàn)的細(xì)節(jié)只能通過閱讀源碼來了解。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7347

    瀏覽量

    95000
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4421

    瀏覽量

    67816
  • epoll
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    3332

原文標(biāo)題:圖解:epoll怎么實(shí)現(xiàn)的

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    導(dǎo)熱凝膠的導(dǎo)熱系數(shù)、粘度、硬度等性能參數(shù)的深度解讀

    導(dǎo)熱凝膠的性能評(píng)估需綜合多個(gè)關(guān)鍵參數(shù),僅關(guān)注導(dǎo)熱系數(shù)不足以全面反映其實(shí)際應(yīng)用表現(xiàn)。以下對(duì)導(dǎo)熱系數(shù)、粘度、硬度三項(xiàng)核心參數(shù)進(jìn)行科學(xué)解讀,幫助用戶實(shí)現(xiàn)精準(zhǔn)選型。一、導(dǎo)熱系數(shù)(單位:W/m·K)定義:衡量
    的頭像 發(fā)表于 01-30 16:27 ?503次閱讀
    導(dǎo)熱凝膠的導(dǎo)熱系數(shù)、粘度、硬度等性能參數(shù)的<b class='flag-5'>深度</b><b class='flag-5'>解讀</b>

    高壓起弧試驗(yàn)機(jī)測試數(shù)據(jù)的深度解讀:從電弧痕跡到材料失效分析

    。對(duì)這些數(shù)據(jù)的深度解讀,能讓測試從 “結(jié)果判定” 升級(jí)為 “問題溯源”,為高壓設(shè)備安全性能的提升提供精準(zhǔn)指引。? 電弧痕跡是測試數(shù)據(jù)中最直觀的“信號(hào)”,不同形態(tài)的痕跡背后,隱藏著被測試件在電弧作用下的真實(shí)反應(yīng)。有的
    的頭像 發(fā)表于 10-14 09:18 ?552次閱讀

    HarmonyOSAI編程智能代碼解讀

    CodeGenie > Explain Code,開始解讀當(dāng)前代碼內(nèi)容。 說明 最多支持解讀20000字符以內(nèi)的代碼片段。 使用該功能需先完成CodeGenie登錄授權(quán)。 本文主要從參考引用自HarmonyOS官方文檔
    發(fā)表于 09-02 16:29

    HarmonyOS AI輔助編程工具(CodeGenie)代碼智能解讀

    。 選中.ets文件或者.cpp文件中需要被解釋的代碼行或代碼片段,右鍵選擇CodeGenie > Explain Code,開始解讀當(dāng)前代碼內(nèi)容。 說明 ?最多支持解讀20000字符以內(nèi)
    發(fā)表于 07-17 17:02

    AI SoC #BK7258 AI能力和技術(shù)參數(shù)深度解讀

    BK7258芯片AI能力深度解讀 BK7258是博通集成推出的一款高集成度Wi-Fi 6+藍(lán)牙5.4低功耗音視頻SoC芯片,其AI能力通過硬件加速、算法優(yōu)化及生態(tài)整合實(shí)現(xiàn),覆蓋邊緣計(jì)算、端云協(xié)同兩大
    的頭像 發(fā)表于 06-20 09:44 ?7420次閱讀
    AI SoC #BK7258 AI能力和技術(shù)參數(shù)<b class='flag-5'>深度</b><b class='flag-5'>解讀</b>

    直播 | GB/T 45086與ISO11451標(biāo)準(zhǔn)深度解讀研討會(huì)筆記請(qǐng)查收!

    6月12日,《德思特GB/T 45086與ISO11451標(biāo)準(zhǔn)深度解讀》線上研討會(huì)圓滿結(jié)束。感謝大家的觀看與支持!在直播間收到一些觀眾的技術(shù)問題,我們匯總了熱點(diǎn)問題并請(qǐng)講師詳細(xì)解答,在此整理分享給大家,請(qǐng)查收!
    的頭像 發(fā)表于 06-18 11:06 ?1157次閱讀
    直播 | GB/T 45086與ISO11451標(biāo)準(zhǔn)<b class='flag-5'>深度</b><b class='flag-5'>解讀</b>研討會(huì)筆記請(qǐng)查收!

    革命性神經(jīng)形態(tài)微控制器 ?**Pulsar**? 的深度技術(shù)解讀

    以下是對(duì)荷蘭公司Innatera推出的革命性神經(jīng)形態(tài)微控制器 ? Pulsar ? 的深度技術(shù)解讀,結(jié)合其架構(gòu)設(shè)計(jì)、性能突破、應(yīng)用場景及產(chǎn)業(yè)意義進(jìn)行綜合分析: 一、核心技術(shù)原理:神經(jīng)形態(tài)架構(gòu)的突破
    的頭像 發(fā)表于 06-07 13:06 ?1858次閱讀
    革命性神經(jīng)形態(tài)微控制器 ?**Pulsar**? 的<b class='flag-5'>深度</b>技術(shù)<b class='flag-5'>解讀</b>

    瑞薩365 深度解讀

    技術(shù)架構(gòu)、核心功能、行業(yè)影響及未來展望四個(gè)維度進(jìn)行深度解讀: 一、技術(shù)架構(gòu):融合硬件與設(shè)計(jì)軟件的跨領(lǐng)域協(xié)作平臺(tái) 瑞薩365基于Altium 365云平臺(tái)構(gòu)建,整合了瑞薩的半導(dǎo)體產(chǎn)品組合與Altium的設(shè)計(jì)工具鏈,形成從芯片選型到系統(tǒng)部署的全流程數(shù)字環(huán)境。其核心架構(gòu)圍繞 五
    的頭像 發(fā)表于 06-06 09:58 ?2525次閱讀
    瑞薩365 <b class='flag-5'>深度</b><b class='flag-5'>解讀</b>

    蘋果A20芯片的深度解讀

    以下是基于最新行業(yè)爆料對(duì)蘋果A20芯片的深度解讀,綜合技術(shù)革新、性能提升及行業(yè)影響三大維度分析: 一、核心技術(shù)創(chuàng)新 ? ? 制程工藝突破 ? ? 全球首款2nm芯片 ?:采用臺(tái)積電N2(第一代2納米
    的頭像 發(fā)表于 06-06 09:32 ?4368次閱讀

    ARM Mali GPU 深度解讀

    ARM Mali GPU 深度解讀 ARM Mali 是 Arm 公司面向移動(dòng)設(shè)備、嵌入式系統(tǒng)和基礎(chǔ)設(shè)施市場設(shè)計(jì)的圖形處理器(GPU)IP 核,憑借其異構(gòu)計(jì)算架構(gòu)、能效優(yōu)化和生態(tài)協(xié)同,成為全球移動(dòng)
    的頭像 發(fā)表于 05-29 10:12 ?4867次閱讀

    Arm 公司面向 PC 市場的 ?Arm Niva? 深度解讀

    面向 PC 市場的 ? Arm Niva ? 深度解讀 ? Arm Niva ? 是 Arm 公司為 PC 市場推出的核心計(jì)算平臺(tái),屬于其“平臺(tái)優(yōu)先”戰(zhàn)略的關(guān)鍵布局。作為 ? Arm 計(jì)算
    的頭像 發(fā)表于 05-29 09:56 ?1843次閱讀

    Arm 公司面向移動(dòng)端市場的 ?Arm Lumex? 深度解讀

    面向移動(dòng)端市場的 ? Arm Lumex ? 深度解讀 ? Arm Lumex ? 是 Arm 公司面向移動(dòng)設(shè)備市場推出的新一代計(jì)算平臺(tái),隸屬于其“平臺(tái)優(yōu)先”戰(zhàn)略的核心布局。作為 ? Arm 計(jì)算
    的頭像 發(fā)表于 05-29 09:54 ?4538次閱讀

    Arm 公司面向汽車市場的 ?Arm Zena? 深度解讀

    面向汽車市場的 ? Arm Zena ? 深度解讀 Arm Zena 是 Arm 公司面向智能汽車領(lǐng)域推出的核心計(jì)算平臺(tái),屬于其“平臺(tái)優(yōu)先”戰(zhàn)略的關(guān)鍵布局。作為 Arm 計(jì)算子系統(tǒng)(CSS)在
    的頭像 發(fā)表于 05-29 09:51 ?2668次閱讀

    SPI協(xié)議,寄存器解讀

    最近在學(xué)習(xí)SPI協(xié)議,對(duì)寄存器操作不是特別熟練。發(fā)帖希望有大佬能從寄存器角度提供幫助,幫忙指導(dǎo)根據(jù)手冊(cè)去解讀協(xié)議。有償。
    發(fā)表于 05-22 20:08

    兆易創(chuàng)新人形機(jī)器人方案 深度解讀

    三個(gè)維度展開深度解讀: 一、核心產(chǎn)品型號(hào)與應(yīng)用場景 (一)主控MCU:多場景精準(zhǔn)適配 GD32H7系列(高性能計(jì)算) 代表型號(hào) :GD32H75E(Cortex-M7內(nèi)核,600MHz主頻) 特性 : 雙發(fā)射6級(jí)流水線架構(gòu)+雙精度浮點(diǎn)單元(FPU),支持復(fù)雜算法(如逆運(yùn)動(dòng)
    的頭像 發(fā)表于 05-07 15:56 ?2112次閱讀