AE eventloop

閱讀瀏覽器源碼的好工具:SourceGraph

Redis通過將對應(yīng)事件注冊到eventloop中絮重,然后不斷循環(huán)檢測有無事件觸發(fā)挂签。

循環(huán)檢測

aeProcessEvents代表處理一次循環(huán)事件處理:

  1. 取出最近的一次定時器事件销凑。
  2. 計算該超時定時事件還有多久才可以觸發(fā)呜达,若已超時則設(shè)置t為0,其中t為第3步的超時閾值教沾。
  3. 調(diào)用select或者epoll等待網(wǎng)絡(luò)事件觸發(fā)闯两,或者超時钟病。
  4. 處理觸發(fā)的各個事件,包括網(wǎng)絡(luò)事件和超時事件姑子。

也就是說每次循環(huán)事件處理中乎婿,網(wǎng)絡(luò)IO讀寫事件的處理過程中,會順便檢測處理定時事件街佑。

關(guān)于第2點的額外說明谢翎,每次事件循環(huán)處理周期當(dāng)中,獲取距離當(dāng)前的這個時間間隔值沐旨。拿來做什么用呢森逮?

為了避免“忙等待”,我們在檢查FD的IO讀寫狀態(tài)時(select或者epoll)磁携,都會采用阻塞的方式褒侧,如果沒有可讀可寫的FD,就一直阻塞著等待。但是璃搜,我還有定時器事件要處理啊拖吼,如果一直沒有IO事件,那我定時器事件不是一直沒法處理么这吻?所以吊档,我們會給select或者epoll傳入一個阻塞的超時時間,超過這個時間唾糯,都給我返回怠硼。 下面獲取的這個值,就是用于設(shè)置阻塞超時時間的移怯。這樣做香璃,既可以避免非阻塞式的忙等待,又可以保證定時器事件能夠按時得到處理舟误。 其實這種處理方式非常普遍葡秒,以C為開發(fā)語言的很多服務(wù)型軟件都是這樣玩的。

Redis初始化服務(wù)的時候嵌溢,會先初始化一個Eventloop

server.el = aeCreateEventLoop(server.maxclients+CONFIG_FDSET_INCR); 

EventLoop數(shù)據(jù)結(jié)構(gòu)

目前eventloop支持注冊:

  • 定時器事件
  • 網(wǎng)絡(luò)IO讀寫事件

其中網(wǎng)絡(luò)IO讀寫事件的fd看做下標(biāo)的原因是:Linux內(nèi)核會給每個進程維護一個文件描述符表眯牧。
而POSIX標(biāo)準對于文件描述符進行了以下約束:

  1. fd為0、1赖草、2分別表示標(biāo)準輸入学少、標(biāo)準輸出和錯誤輸出。
  2. 每次新打開的fd秧骑,必須使用當(dāng)前進程中最小可用的文件描述符版确。

因此注冊事件下標(biāo)能與系統(tǒng)fd形成有效重合復(fù)用。

其中我們關(guān)注的網(wǎng)絡(luò)IO事件數(shù)據(jù)結(jié)構(gòu)如下:
網(wǎng)絡(luò)IO讀寫事件

一般情況下乎折,Redis會先處理讀事件(AE_READABLE)绒疗,再處理寫事件(AE_WRITABLE)。 這個順序安排其實也算是一點小優(yōu)化笆檀,先讀后寫可以讓一個請求的處理和回包都是在同一次循環(huán)里面忌堂,使得請求可以盡快地回包。



網(wǎng)絡(luò)IO事件注冊的時候酗洒,除了正常的讀寫事件外士修,還可以注冊一個AE_BARRIER事件,這個事件就是會影響到先讀后寫的處理順序樱衷。 如果某個fd的mask包含AE_BARRIER棋嘲,那它的處理順序會是先寫后讀。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矩桂,一起剝皮案震驚了整個濱河市沸移,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖雹锣,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件网沾,死亡現(xiàn)場離奇詭異,居然都是意外死亡蕊爵,警方通過查閱死者的電腦和手機辉哥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攒射,“玉大人醋旦,你說我怎么就攤上這事』岱牛” “怎么了饲齐?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咧最。 經(jīng)常有香客問我捂人,道長,這世上最難降的妖魔是什么窗市? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任先慷,我火速辦了婚禮,結(jié)果婚禮上咨察,老公的妹妹穿的比我還像新娘。我一直安慰自己福青,他們只是感情好摄狱,可當(dāng)我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著无午,像睡著了一般媒役。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宪迟,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天酣衷,我揣著相機與錄音,去河邊找鬼次泽。 笑死穿仪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的意荤。 我是一名探鬼主播啊片,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼玖像!你這毒婦竟也來了紫谷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笤昨,沒想到半個月后祖驱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡瞒窒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年捺僻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片根竿。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡陵像,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寇壳,到底是詐尸還是另有隱情醒颖,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布壳炎,位于F島的核電站泞歉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏匿辩。R本人自食惡果不足惜腰耙,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铲球。 院中可真熱鬧挺庞,春花似錦、人聲如沸稼病。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽然走。三九已至援制,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芍瑞,已是汗流浹背晨仑。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拆檬,地道東北人洪己。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像秩仆,于是被迫代替她去往敵國和親码泛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容