當前位置:編程學習大全網 - 源碼下載 - epoll模型

epoll模型

最近壹段時間看epoll的源碼,看的抓耳撓腮。本著分享的原則,分享壹下我對epoll的理解,註意:本文並不能讓妳從零開始學epoll,而是希望在妳看epoll源碼也學的抓耳撓腮的時候,看到本文能對妳有壹丟小小的幫助。

本篇文章並不會設計到具體源碼,只是涉及到epoll的整個數據交互的流程。

壹個應用程序,想要使用epoll模型,首先會創建壹個epoll模型。這裏是在內核創建壹個epoll模型,妳可以把這個模型看做壹個java對象。這個對象裏有壹個阻塞列表,壹個就緒列表,壹個紅黑樹。

每壹次通訊,客戶端都會建立壹個socket,socket有壹個文件描述符fd,系統通過這個fd去操作socket,系統會封裝壹個epitem(紅黑樹的節點),這個epitem包含socket和壹個回調事件,當然還有其他屬性,我們暫且不提。

然後內核會把這個epitem添加到紅黑樹,當然,也可以修改和刪除事件。

用戶進程去就緒列表拿就緒事件。拿到就返回,拿不到就進入epoll阻塞列表,當然也可以設置超時參數為0表示拿不到也立即返回。

回調事件會根據監聽的事件類型,把fd放到就緒列表。然後去通知阻塞進程。阻塞進程從就緒列表拿走就緒事件,也就是把就緒事件從內核空間拷貝到用戶空間。

這是我對epoll模型的大概描述,接下來,從交互的層面再說壹說:

當壹個數據包從網絡傳輸過來,包含了協議,發送端ip 和端口,目標端ip和接口。內核根據這五個要素去找到對應的socket,就可以拿到對應的fd,有了fd,就可以去紅黑樹裏找epitem,找到了epitem就可以去觸發回調事件。回調事件就可以把就緒事件放到就緒列表。

輸入netstat命名就可以查看系統的所有活躍的socket鏈接:

例子裏,本地機器有兩個socket鏈接和172.217.27.42.443端口建立了鏈接,當網絡數據包傳輸過來,發送端ip和端口號就是172.217.27.42.443,接收端可能是54040和54035端口,用發送端ip和端口號為參數去對應foreign address,用接收端參數去對應local address,就可以找到具體的哪壹個socket連接。

如果在拷貝就緒事件的時候,出現了新的就緒事件怎麽辦,其實還有壹個備用鏈表,拷貝事件的時候,如果有就緒事件產生,先放到備用鏈表,拷貝完成再把備用鏈表的就緒事件放到就緒列表裏。

如果想看細節,還是得自己擼源碼,別人講只能聽個大概。

  • 上一篇:TRQ未來能超越shib嗎?
  • 下一篇:魚灣到四會羅源鎮有多遠
  • copyright 2024編程學習大全網