libevent源码学习-----事件驱动流程分析
生活随笔
收集整理的這篇文章主要介紹了
libevent源码学习-----事件驱动流程分析
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
libevent中事件驅(qū)動的大體流程如下
/* 創(chuàng)建事件驅(qū)動 */ struct event_base* base = event_base_new(); /**創(chuàng)建一個事件*@param base: 事件驅(qū)動*@param fd: event對應(yīng)的文件描述符,通常是通過socket創(chuàng)建的套接字*@param EV_READ: 想要監(jiān)聽fd的哪些事件,EV_READ表示監(jiān)聽fd是否可讀,也可以是EV_PERSIST代表這個event是永久事件,在調(diào)用一次回調(diào)函數(shù)后仍然繼續(xù)監(jiān)聽,對應(yīng)一次性event,調(diào)用后不再監(jiān)聽*@param cb: 當(dāng)fd對應(yīng)的事件發(fā)生后調(diào)用的回調(diào)函數(shù),用戶提供*@param arg: 傳給回調(diào)函數(shù)cb的參數(shù)*/ struct event* ev = event_new(base, fd, EV_READ|EV_PERSIST, cb, arg);/* *將event添加到事件驅(qū)動中,由base統(tǒng)一管理event,當(dāng)event對應(yīng)的fd的事件發(fā)生,會自動調(diào)用event對應(yīng)的cb*NULL表示不設(shè)置超時時間,如果設(shè)置,則在規(guī)定時間之內(nèi)沒有發(fā)生事件就會停止監(jiān)控,刪除event,設(shè)置EV_PERSIST時還會重新將event添加到base中*/ event_add(ev, NULL);/* 開始事件驅(qū)動主循環(huán) */ event_base_dispatch(base);/* 釋放base */ event_base_free(base);創(chuàng)建事件驅(qū)動base時調(diào)用的event_base_new主要時用于對base進(jìn)行初始化,包括初始化
- 用于存放監(jiān)聽文件描述符的event的map
- 用于存放監(jiān)聽信號的event的map
- 用于存放具有超時時間的event的最小堆,超時時間為絕對時間,具體可以參考時間管理
- 用于存放已注冊event的隊列
- 用于存放相應(yīng)事件發(fā)生(已激活)event的隊列
- 選擇合適的io多路復(fù)用函數(shù),可以參考io多路復(fù)用的封裝和使用
創(chuàng)建事件event時調(diào)用的event_new主要是對event進(jìn)行初始化,包括初始化
- 文件描述符/信號值
- 回調(diào)函數(shù)
- 監(jiān)聽的事件
- 絕對時間表示的超時時間(如果有的話)
- 在激活隊列中的優(yōu)先級
- …
總之就是各種初始化,沒有什么特別之處,在設(shè)計過程中需要用到什么,就在struct event結(jié)構(gòu)體中添加什么,然后在event_new中初始化什么
event詳解參考event操作
添加event到base時調(diào)用的event_add主要是將event注冊到base中,包括
- 添加event到注冊隊列中
- 添加event到io map/signal map中,同時將其添加到io多路復(fù)用函數(shù)中,信號會單獨處理
- 添加event到最小堆中(如果設(shè)置了超時時間的話)
對信號的處理參考統(tǒng)一事件源
第二個參數(shù)可以指定超時時長,可以參考時間管理
開啟事件驅(qū)動主循環(huán)時調(diào)用的event_base_dispatch主要就是進(jìn)入while循環(huán),包括
- 確認(rèn)io多路復(fù)用函數(shù)的阻塞時長,方法是選取最小的絕對超時時間(最小堆堆頂)
- 調(diào)用io多路復(fù)用函數(shù),如果有某事件發(fā)生,將其添加到base的激活隊列中,激活原因為事件發(fā)生
- 判斷最小堆中的event是否超時,如果超時,方法激活隊列中,激活原因為超時
- 按照優(yōu)先級順序處理激活隊列中的event,調(diào)用對應(yīng)的回調(diào)函數(shù)
選擇io多路復(fù)用函數(shù)的阻塞時長為最小堆堆頂?shù)脑?#xff1a;
- 為了滿足可以監(jiān)控具有超時時間的event,必須為io函數(shù)提供一個阻塞時長,不能是NULL,否則會一直等到有事件發(fā)生
- 因為是絕對時間,所以當(dāng)堆頂?shù)膃vent超時,最小堆其他event不可能已經(jīng)超時,所以不會影響其他具有超時時間的event,更不會影響沒有超時時間的event
- 綜上選擇堆頂超時時間最為合適
總結(jié)
以上是生活随笔為你收集整理的libevent源码学习-----事件驱动流程分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: libevent源码学习-----Rea
- 下一篇: libevent源码学习-----统一事