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

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

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

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

深度解讀epoll 的原理

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

掃碼添加小助手

加入工程師交流群

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

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

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

如 圖1 所示,內(nèi)核負(fù)責(zé)監(jiān)聽(tīng)多個(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)聽(tīng)多個(gè) I/O 流,并且會(huì)把就緒的 I/O 流告知進(jìn)程。

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

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

紅黑樹(shù)

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

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

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

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

就緒隊(duì)列

另外,epoll 還維護(hù)著一個(gè)就緒隊(duì)列,當(dāng) epoll 監(jiān)聽(tīng)的 socket 狀態(tài)發(fā)生改變(變?yōu)榭勺x或可寫(xiě))時(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ù)來(lái)通知 epoll,我們來(lái)看看這個(gè)函數(shù)的處理過(guò)程:

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ù)組來(lái)存儲(chǔ)就緒的 socket。當(dāng) epoll_wait 返回后,用戶就可以從events 數(shù)組中獲取到就緒的 socket,并可對(duì)其進(jìn)行讀寫(xiě)操作。

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

編輯:jq

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

    關(guān)注

    8

    文章

    7297

    瀏覽量

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

    關(guān)注

    3

    文章

    4401

    瀏覽量

    66462
  • epoll
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    3257

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    HarmonyOSAI編程智能代碼解讀

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

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

    BK7258芯片AI能力深度解讀 BK7258是博通集成推出的一款高集成度Wi-Fi 6+藍(lán)牙5.4低功耗音視頻SoC芯片,其AI能力通過(guò)硬件加速、算法優(yōu)化及生態(tài)整合實(shí)現(xiàn),覆蓋邊緣計(jì)算、端云協(xié)同兩大
    的頭像 發(fā)表于 06-20 09:44 ?4638次閱讀
    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ù)問(wèn)題,我們匯總了熱點(diǎn)問(wèn)題并請(qǐng)講師詳細(xì)解答,在此整理分享給大家,請(qǐng)查收!
    的頭像 發(fā)表于 06-18 11:06 ?722次閱讀
    直播 | 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ǎng)景及產(chǎn)業(yè)意義進(jìn)行綜合分析: 一、核心技術(shù)原理:神經(jīng)形態(tài)架構(gòu)的突破
    的頭像 發(fā)表于 06-07 13:06 ?1175次閱讀
    革命性神經(jīng)形態(tài)微控制器 ?**Pulsar**? 的<b class='flag-5'>深度</b>技術(shù)<b class='flag-5'>解讀</b>

    瑞薩365 深度解讀

    技術(shù)架構(gòu)、核心功能、行業(yè)影響及未來(lái)展望四個(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 ?1376次閱讀
    瑞薩365 <b class='flag-5'>深度</b><b class='flag-5'>解讀</b>

    蘋(píng)果A20芯片的深度解讀

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

    ARM Mali GPU 深度解讀

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

    Arm 公司面向 PC 市場(chǎng)的 ?Arm Niva? 深度解讀

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

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

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

    Arm 公司面向汽車市場(chǎng)的 ?Arm Zena? 深度解讀

    面向汽車市場(chǎng)的 ? 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 ?1850次閱讀

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

    三個(gè)維度展開(kāi)深度解讀: 一、核心產(chǎn)品型號(hào)與應(yīng)用場(chǎng)景 (一)主控MCU:多場(chǎng)景精準(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 ?1038次閱讀

    谷歌第七代TPU Ironwood深度解讀:AI推理時(shí)代的硬件革命

    谷歌第七代TPU Ironwood深度解讀:AI推理時(shí)代的硬件革命 Google 發(fā)布了 Ironwood,這是其第七代張量處理單元 (TPU),專為推理而設(shè)計(jì)。這款功能強(qiáng)大的 AI 加速器旨在處理
    的頭像 發(fā)表于 04-12 11:10 ?2436次閱讀
    谷歌第七代TPU Ironwood<b class='flag-5'>深度</b><b class='flag-5'>解讀</b>:AI推理時(shí)代的硬件革命

    英偉達(dá)Cosmos-Reason1 模型深度解讀

    。以下從技術(shù)架構(gòu)、訓(xùn)練策略、核心能力及行業(yè)影響四方面展開(kāi)深度解讀: Cosmos-Reason 1:從物理 AI 常識(shí)到具體決策 物理 AI 系統(tǒng)需要感知、理解和執(zhí)行物理世界中的復(fù)雜作。在本文中,我們提出了 Cosmos-Reason1 模型,該模型可以理解物理世界并通過(guò)
    的頭像 發(fā)表于 03-29 23:29 ?2492次閱讀

    深度解讀 30KPA64A 單向 TVS:64V 擊穿機(jī)制與高效防護(hù)策略

    深度解讀 30KPA64A 單向 TVS:64V 擊穿機(jī)制與高效防護(hù)策略
    的頭像 發(fā)表于 02-24 13:52 ?516次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>解讀</b> 30KPA64A 單向 TVS:64V 擊穿機(jī)制與高效防護(hù)策略

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

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