吴忠躺衫网络科技有限公司

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

完善資料讓更多小伙伴認(rèn)識你,還能領(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í)都會通知進(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)核會把這些 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 流,并且會把就緒的 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 句柄快速找到對應(yīng)的 socket 對象。

就緒隊(duì)列

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

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

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

當(dāng) socket 狀態(tài)發(fā)生變化時(shí),會調(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)程被喚醒后,就會從就緒隊(duì)列中,把就緒的 socket 復(fù)制到用戶提供的數(shù)組中。如 圖4 所示:

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

如 圖4 所示,在調(diào)用 epoll_wait 時(shí)需要提供一個(gè) events 數(shù)組來存儲就緒的 socket。當(dāng) epoll_wait 返回后,用戶就可以從events 數(shù)組中獲取到就緒的 socket,并可對其進(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ī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7145

    瀏覽量

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

    關(guān)注

    3

    文章

    4346

    瀏覽量

    62979
  • epoll
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    2985

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    3D深度感測的原理和使用二極管激光來實(shí)現(xiàn)深度感測的優(yōu)勢

    ? 本文介紹了3D深度感測的原理和使用二極管激光來實(shí)現(xiàn)深度感測的優(yōu)勢。 世界是三維的。這句話如此容易理解,以至于大多數(shù)人從未懷疑過自己感知世界的方式。但事實(shí)上,人的每只眼睛每次可捕獲一幅平面圖
    的頭像 發(fā)表于 01-07 09:54 ?159次閱讀
    3D<b class='flag-5'>深度</b>感測的原理和使用二極管激光來實(shí)現(xiàn)<b class='flag-5'>深度</b>感測的優(yōu)勢

    MOSFET參數(shù)解讀

    SGT-MOSFET各項(xiàng)參數(shù)解讀
    發(fā)表于 12-30 14:15 ?1次下載

    PCM1680 does not support a board-to-board interface不支持板對板的是怎么解讀

    The PCM1680 does not support a board-to-board interface不支持板對板的是怎么解讀
    發(fā)表于 12-11 07:31

    4G模組加解密藝術(shù):通用函數(shù)的深度解讀

    今天是對加解密通用函數(shù)的深度解讀,我將詳細(xì)講解,建議收藏,不可錯(cuò)過。
    的頭像 發(fā)表于 11-12 09:58 ?306次閱讀
    4G模組加解密藝術(shù):通用函數(shù)的<b class='flag-5'>深度</b><b class='flag-5'>解讀</b>

    京準(zhǔn)電鐘解讀:PTP時(shí)鐘同步系統(tǒng)及應(yīng)用是什么?

    京準(zhǔn)電鐘解讀:PTP時(shí)鐘同步系統(tǒng)及應(yīng)用是什么?
    的頭像 發(fā)表于 10-31 09:35 ?337次閱讀
    京準(zhǔn)電鐘<b class='flag-5'>解讀</b>:PTP時(shí)鐘同步系統(tǒng)及應(yīng)用是什么?

    FPGA做深度學(xué)習(xí)能走多遠(yuǎn)?

    ,共同進(jìn)步。 歡迎加入FPGA技術(shù)微信交流群14群! 交流問題(一) Q:FPGA做深度學(xué)習(xí)能走多遠(yuǎn)?現(xiàn)在用FPGA做深度學(xué)習(xí)加速成為一個(gè)熱門,深鑒科技,商湯,曠視科技等都有基于FPGA做深度學(xué)習(xí)的項(xiàng)目
    發(fā)表于 09-27 20:53

    深度解讀 VCXO VG7050CDN:可變晶體振蕩器的卓越之選

    深度解讀 VCXO VG7050CDN:可變晶體振蕩器的卓越之選
    的頭像 發(fā)表于 07-24 10:58 ?411次閱讀

    解讀MIPI A-PHY與車載Serdes芯片技術(shù)與測試

    上一期,《汽車芯片標(biāo)準(zhǔn)體系建設(shè)指南》技術(shù)解讀與功率芯片測量概覽中,我們給大家介紹了工信部印發(fā)的《汽車芯片標(biāo)準(zhǔn)體系建設(shè)指南》涉及到的重點(diǎn)芯片與測試領(lǐng)域解讀,本期繼續(xù)給大家做延展,我們解讀的是MIPI A-PHY與車載Serdes芯
    的頭像 發(fā)表于 07-24 10:14 ?3062次閱讀
    <b class='flag-5'>解讀</b>MIPI A-PHY與車載Serdes芯片技術(shù)與測試

    ESP32 深度睡眠

    使用的是ESP32S2 idf 5.2.2 官方代碼歷程deep_sleep 進(jìn)入深度睡眠 睡眠后功耗為1.9mA,一直降不下去。
    發(fā)表于 07-11 09:50

    為什么深度睡眠期間RTC定時(shí)器會丟失呢?

    RTC定時(shí)器在深度睡眠期間丟失是否是一種設(shè)計(jì)功能?我觀察到以下內(nèi)容(使用 SDK 1.3): The chip is awakened from deep sleep after a timer
    發(fā)表于 07-11 07:17

    解讀PyTorch模型訓(xùn)練過程

    PyTorch作為一個(gè)開源的機(jī)器學(xué)習(xí)庫,以其動態(tài)計(jì)算圖、易于使用的API和強(qiáng)大的靈活性,在深度學(xué)習(xí)領(lǐng)域得到了廣泛的應(yīng)用。本文將深入解讀PyTorch模型訓(xùn)練的全過程,包括數(shù)據(jù)準(zhǔn)備、模型構(gòu)建、訓(xùn)練循環(huán)、評估與保存等關(guān)鍵步驟,并結(jié)合相關(guān)數(shù)字和信息進(jìn)行詳細(xì)闡述。
    的頭像 發(fā)表于 07-03 16:07 ?1165次閱讀

    深度學(xué)習(xí)的典型模型和訓(xùn)練過程

    深度學(xué)習(xí)作為人工智能領(lǐng)域的一個(gè)重要分支,近年來在圖像識別、語音識別、自然語言處理等多個(gè)領(lǐng)域取得了顯著進(jìn)展。其核心在于通過構(gòu)建復(fù)雜的神經(jīng)網(wǎng)絡(luò)模型,從大規(guī)模數(shù)據(jù)中自動學(xué)習(xí)并提取特征,進(jìn)而實(shí)現(xiàn)高效準(zhǔn)確的預(yù)測和分類。本文將深入解讀深度學(xué)
    的頭像 發(fā)表于 07-03 16:06 ?1685次閱讀

    深度解析深度學(xué)習(xí)下的語義SLAM

    隨著深度學(xué)習(xí)技術(shù)的興起,計(jì)算機(jī)視覺的許多傳統(tǒng)領(lǐng)域都取得了突破性進(jìn)展,例如目標(biāo)的檢測、識別和分類等領(lǐng)域。近年來,研究人員開始在視覺SLAM算法中引入深度學(xué)習(xí)技術(shù),使得深度學(xué)習(xí)SLAM系統(tǒng)獲得了迅速發(fā)展,并且比傳統(tǒng)算法展現(xiàn)出更高的精
    發(fā)表于 04-23 17:18 ?1381次閱讀
    <b class='flag-5'>深度</b>解析<b class='flag-5'>深度</b>學(xué)習(xí)下的語義SLAM

    深度解讀廣汽全固態(tài)電池技術(shù)

    4月12日,在“科技視界”廣汽科技日活動上,廣汽集團(tuán)發(fā)布了被稱為“全球動力電池領(lǐng)域競爭的技術(shù)高地”的全固態(tài)動力電池技術(shù),廣汽埃安電池研發(fā)部負(fù)責(zé)人李進(jìn)對此項(xiàng)技術(shù)進(jìn)行了解讀
    的頭像 發(fā)表于 04-15 09:15 ?593次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>解讀</b>廣汽全固態(tài)電池技術(shù)

    EMC技術(shù):基礎(chǔ)概念到應(yīng)用的解讀

    EMC技術(shù):基礎(chǔ)概念到應(yīng)用的解讀?|深圳比創(chuàng)達(dá)電子
    的頭像 發(fā)表于 03-11 11:55 ?690次閱讀
    EMC技術(shù):基礎(chǔ)概念到應(yīng)用的<b class='flag-5'>解讀</b>?
    街机水果机游戏下载| 百家乐设备电子路| 澳门百家乐会出千吗| 百家乐网站是多少| 百家乐是个什么样的游戏 | 阳宅24山流年吉凶方位| 波音百家乐自动投注| 盈得利百家乐娱乐城| 大发888娱乐场 17| 武夷山市| 百家乐官网赌博工具| 百家乐真人视屏游戏| 欢乐谷百家乐的玩法技巧和规则| 大发888娱乐城官方下载| 7080棋牌| 豪华百家乐官网桌子| 百家乐什么叫缆| 三国百家乐的玩法技巧和规则| 足球比分直播| 玩百家乐官网会犯法吗| 互博百家乐官网的玩法技巧和规则| 百家乐庄闲必胜规| 博e百娱乐城怎么样| 万龙百家乐的玩法技巧和规则 | 大发888 赌博网站大全| 百家乐官网视频裸聊| 犹太人百家乐官网的玩法技巧和规则| 百家乐微乐| 澳门永利| 利都百家乐官网国际娱乐场| 百家乐8点直赢| 德州扑克怎么玩的| 百家乐官网庄闲筹码| 百家乐视频游戏聊天| 皇冠现金网是真的吗| 网络百家乐官网输了很多钱| 亲朋棋牌手机版下载| 百家乐官网对付抽水| 赌神网百家乐的玩法技巧和规则 | 大发888ber| 买百家乐官网程序|