日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

libevent源码学习-----事件驱动流程分析

發(fā)布時間:2024/4/19 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
  • 綜上選擇堆頂超時時間最為合適
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的libevent源码学习-----事件驱动流程分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。