1. 程式人生 > >關於EPOLL的ET和LT模式的深入理解

關於EPOLL的ET和LT模式的深入理解

epoll也是實現I/O多路複用的一種方法。epoll水平觸發(level trigger,LT,LT為epoll的預設工作模式)與邊緣觸發(edge trigger,ET)兩種工作模式。使用脈衝訊號來解釋LT和ET可能更加貼切。Level是指訊號只需要處於水平,就一直會觸發;而edge則是指訊號為上升沿或者下降沿時觸發。

LT:只要核心緩衝區有資料就一直通知,只要socket處於可讀狀態或可寫狀態,就會一直返回sockfd;

ET:只有狀態發生變化才通知,只有當socket由不可寫到可寫或由不可讀到可讀,才會返回其sockfd;

注:(在新增EPOLLIN、EPOLLOUT事件的前提下。)

水平觸發

1. 對於讀操作

只要緩衝內容不為空,LT模式返回讀就緒。

2. 對於寫操作

只要緩衝區還不滿,LT模式會返回寫就緒。

邊緣觸發

1. 對於讀操作

(1)當緩衝區由不可讀變為可讀的時候,即緩衝區由空變為不空的時候。

(2)當有新資料到達時,即緩衝區中的待讀資料變多的時候。

(3)當緩衝區有資料可讀,且應用程序對相應的描述符進行EPOLL_CTL_MOD 修改EPOLLIN事件時。

2. 對於寫操作

(1)當緩衝區由不可寫變為可寫時。

(2)當有舊資料被髮送走,即緩衝區中的內容變少的時候。

(3)當緩衝區有空間可寫,且應用程序對相應的描述符進行EPOLL_CTL_MOD

 修改EPOLLOUT事件時。

究竟觸發了多少次呢?可以這樣想:

(1)當資料量SIZE小於recv函式的接收長度len且小於系統緩衝SO_RCVBUF的時候:ET與LT都觸發一次,recv執行一次。

(2)當資料量SIZE大於recv接收長度len但小於系統緩衝SO_RCVBUF的時候:LT觸發SIZE/len次,ET觸發一次。兩者的recv函式執行SIZE/len。(一次ET觸發可執行多次recv)

(3)當資料量SIZE大於recv接收長度len且大於系統緩衝SO_RCVBUF的時候:LT觸發SIZE/len次,ET觸發SIZE/SO_RCVBUF次。兩者的recv函式都執行SIZE/len次。(同樣一次ET觸發執行了多次recv)

顯然:

1、ET模式可以顯著降低同一個Epoll事件的觸發次數。

2、ET模式下同一檔案描述符的同類事件有可能多次觸發。如:系統讀/寫緩衝區溢位會分別導致同一個描述符的EPOLLIN/EPOLLOUT事件多次觸發。

另外幾點要知道:

(1)send和recv函式的len引數是每一次接受或傳送的資料量的上限

(2)ET模式下確實每次都終止於EAGAIN。recv的指定的接收長度較小的時候,ET模式下的一次觸發會執行多次recv。直到某次recv操作把errno變成了EAGAIN為止。此時errno==EAGAIN條件成立。

(3)這種觸發是系統自動完成的。某些程式在errno==EAGAIN的時候,又做了寫epoll_ctl配置有點誤導人。

(4)兩種模式下的recv函式執行的次數都是一樣的。

(5)具體執行次數還要考慮緩衝區門限之類的,並非這麼簡單。

相關推薦

關於EPOLL的ETLT模式深入理解

epoll也是實現I/O多路複用的一種方法。epoll水平觸發(level trigger,LT,LT為epoll的預設工作模式)與邊緣觸發(edge trigger,ET)兩種工作模式。使用脈衝訊號來解釋LT和ET可能更加貼切。Level是指訊號只需要處於水平,就一直會觸發

C++筆記(十一)——多型的概念作用(深入理解

        多型是面向物件的重要特性,簡單點說:“一個介面,多種實現”,就是同一種事物表現出的多種形態。         程式設計其實就是一個將具體世界進行抽象化的過程,多型就是抽象化的一種體現,把一系列具體事物的共同點抽象出來, 再通過這個抽象的事物, 與不同的具體事物

matlab cell(元胞陣列)關於元胞陣列的深入理解 元胞陣列中個別元素的刪除

深入理解元胞陣列 matlab 中的 cell 其實也是個陣列,不過一個cell變數後邊既可以接小括號“()”,又可以接大括號"{}",這有什麼區別呢? 在 matlab 中,所有的陣列都可以用“(i)”來表示其中的第i個元素,元胞陣列還可以用“{i}”,表示第i個cel

關於神經網路中隱藏層神經元的深入理解

最近複習了一下基礎知識,看到MLP的結構,關於隱藏層和神經元有了新的一些理解。 隱藏層的意義 要說明隱藏層的意義,需要從兩個方面理解,一個是單個隱藏層的意義,一個是多層隱藏層的意義。 單個隱藏層的意義 隱藏層的意義就是把輸入資料的特徵,抽象到另一個維度空間,來

Linux Page cachebuffer cache深入理解

Page cache和buffer cache一直以來是兩個比較容易混淆的概念,在網上也有很多人在爭辯和猜想這兩個cache到底有什麼區別,討論到最後也一直沒有一個統一和正確的結論,在我工作的這一段時間,page cache和buffer cache的概念曾經困擾過我,但是仔細分析一下,這兩個概念實際上非常的

對IIS7經典模式整合模式理解

從IIS6新增應用程式池的概念,到現在IIS7,對HTTP請求處理功能已經越來越精確化和不斷改善,IIS7應用程式池新增了經典模式和整合模式可供選擇,不管官方還是一些書籍或文章都有介紹,但多數過於官方話,下面白話一下我對經典模式和整合模式的理解,希望能對自己以後和其他人更貼切的參考。涉及IIS解析ASP.

java 23種設計模式 深入理解

strong 觀察 結構型 工廠 設計模式 .html 外觀 資料 訪問者模式 以下是學習過程中查詢的資料,別人總結的資料,比較容易理解(站在各位巨人的肩膀上,望博主勿究) 創建型抽象工廠模式 http://www.cnblogs.com/java-my-life/arch

單例模式深入理解(轉)

一. 什麼是單例模式因程式需要,有時我們只需要某個類同時保留一個物件,不希望有更多物件,此時,我們則應考慮單例模式的設計。二. 單例模式的特點1. 單例模式只能有一個例項。2. 單例類必須建立自己的唯一例項。3. 單例類必須向其他物件提供這一例項。三. 單例模式VS靜態類在知道了什麼是單例模式後,我想你一定會

epoll ET模式LT模式分析

關於epoll的問題很早就像寫文章講講自己的看法,但是由於ffrpc一直沒有完工,所以也就拖下來了。Epoll主要在伺服器程式設計中使用,本文主要探討伺服器程式中epoll的使用技巧。Epoll一般和非同步io結合使用,故本文討論基於以下應用場合:   主要討論伺服器程式

Android學習之淺談對MVC模式MVP模式理解

進來聽群裡大神們一直在講MVP模式的好處優點種種…,因為mvp出來有一段時間了,但是還沒怎麼了解過,所以週末看了看,並且敲了幾個demo,感覺有點心得了,就淺談一下自己的理解,不正確的地方請及時指出,謝謝! MVC模式: 邏輯:View通知Con

z-indexposition的深入理解-css

在網頁設計中,position屬性的使用是非常重要的。有時如果不能認識清楚這個屬性,將會給我們帶來很多意想不到的困難。並且css中的z-index屬性,簡單而又複雜;搞不懂裡面的原理,很難實現自己的功能。這次記錄下自己的查詢。 詳情見:深入理解css中的posi

基於Java的責任鏈模式深入理解

一、引言   初看責任鏈模式,心裡不禁想起了一個以前聽過的相聲:看牙。說的是一個病人看牙的時候,醫生不小心把拔下的一個牙掉進了病人嗓子裡。病人因此樓上樓下的跑了好多科室,最後無果而終。  責任鏈模式就是這種“推卸”責任的模式,你的問題在我這裡能解決我就解決,不行就把你推給另一

從模板方法模式深入理解Java抽象類

二話不說先上程式碼,如下所示為一個抽象類(抽象汽車模型)與它的兩個具體實現類(寶馬模型、賓士模型)的模擬程式: /* * 抽象模板類,抽象汽車模型 */ public abstract class

java筆記之waitnotify的深入理解

package com.lyzx.concurrent.lock; /** * 測試wait和Notify的筆記,在看讀寫鎖原始碼時的感想, * 當很多執行緒在一個物件上等待時,呼叫該物件的not

對於i++++i的深入理解

在學完jvm的一些知識後,發現有些令人云山霧罩的問題,逐漸變得條理清晰。首先,在這裡保證,看完以下解釋,讓你徹底明白i++和++i的原理,而不是停留在先賦值後運算的淺層次的理解。因為涉及底層,有些東西可能晦澀難懂,但難能可貴。但柳岸花明又一村,相信你可以。加油。

SpringIOC二—— 容器 Bean的深入理解

上文:Spring IOC 一——容器裝配Bean的簡單使用 上篇文章介紹了 Spring IOC 中最重要的兩個概念——容器和Bean,以及如何使用 Spring 容器裝配Bean。本文接著記錄 Spring 中 IOC 的相關知識。 部分參考資料: 《Spring實戰(第4版)》 《輕量級 JavaEE

深入理解Spring的兩大特征(IOCAOP)<轉>

編譯器 如果 定義 包括 其他 enc row 這就是 生命 在某博主的博客上看到一篇解釋Spring的兩大核心IOC與AOP的文章,借此轉發一下,希望能夠幫助到更多的人。 原文地址:https://blog.csdn.net/gloomy_114/article/deta

[jvm解析系列][十四]動態代理裝飾模式,帶你看原始碼深入理解裝飾模式動態代理的區別。

不知道大家知不知道設計模式中有一種叫做裝飾,舉一個簡單的例子。 一天一個年輕領導小王講話:咳咳,我們一定要xxx抓緊xxxx學習xxx的精神!好,今天的會議結束! 然後有一個老領導李同志接過來說:那個我在補充兩點,個別同志xxx,一定要注意xxx。好散會。 然後另一天小王同

深入理解Oracle表(5):三大表連線方式詳解之Hash Join的定義,原理,演算法,成本,模式點陣圖

 Hash Join只能用於相等連線,且只能在CBO優化器模式下。相對於nested loop join,hash join更適合處理大型結果集        Hash Join的執行計劃第1個是hash表(build table),第2個探查表(probe table),

深入理解計算機系統-之-數值儲存(一)-CPU大端小端模式詳解

大端與小端 在嵌入式開發中,大端(Big-endian)和小端(Little-endian)是一個很重要的概念。 MSB與LSB 最高有效位(MSB)指二進位制中最高值的位元。在16位元的數字音訊中,其第1個位元便對16bit的字的數值有最大的