libevent源码学习-----Reactor模型
libevent內(nèi)部采用了reactor模型
所謂reactor模型,其實(shí)就是一套事件注冊(cè)機(jī)制,用來(lái)解決單線程的阻塞問(wèn)題。reactor核心思想是將事件和相應(yīng)事件發(fā)生時(shí)想要調(diào)用的函數(shù)都記錄下來(lái),在事件驅(qū)動(dòng)循環(huán)開(kāi)始后進(jìn)行統(tǒng)一監(jiān)測(cè),當(dāng)某個(gè)事件發(fā)生,會(huì)直接調(diào)用相應(yīng)事件的處理函數(shù)。
比如說(shuō)有事件event1,event2,event3。相應(yīng)事件發(fā)生時(shí)想要調(diào)用的回調(diào)函數(shù)是cb1,cb2,cb3。然而如果是順序判斷每個(gè)事件的發(fā)生時(shí),會(huì)是這樣
然而如果在等待event1發(fā)生時(shí)event2發(fā)生了,因?yàn)榇藭r(shí)event1仍然沒(méi)有發(fā)生,所以會(huì)阻塞在等待event1的位置,導(dǎo)致event2發(fā)生了卻沒(méi)有調(diào)用event2的回調(diào)函數(shù)
reactor正是解決這種問(wèn)題的模型,先將event1和cb1,event2和cb2,event3和cb3注冊(cè)到事件驅(qū)動(dòng)上,reactor負(fù)責(zé)以非阻塞的方式等待注冊(cè)事件的發(fā)生,當(dāng)某(些)個(gè)事件發(fā)生時(shí),reactor主動(dòng)調(diào)用相應(yīng)的回調(diào)函數(shù)
注冊(cè)event1和cb1到reactor中 注冊(cè)event2和cb2到reactor中 注冊(cè)event3和cb3到reactor中reactor以阻塞的方式判斷有什么事件發(fā)生,比如調(diào)用io復(fù)用函數(shù) 對(duì)檢測(cè)到發(fā)生的事件調(diào)用對(duì)應(yīng)的回調(diào)函數(shù)與Reactor相對(duì)應(yīng)的有一個(gè)Proactor模型,它才是真正意義上的異步,而Reactor只能稱為同步
二者不同之處在于
- Reactor需要由應(yīng)用程序本身調(diào)用回調(diào)函數(shù),在這個(gè)時(shí)候僅僅是一個(gè)一個(gè)回調(diào)函數(shù)的調(diào)用,即同步調(diào)用,如果某個(gè)回調(diào)函數(shù)執(zhí)行時(shí)間過(guò)長(zhǎng),會(huì)影響后面的函數(shù)調(diào)用
- Proactor不需要應(yīng)用程序調(diào)用,而是交給內(nèi)核執(zhí)行回調(diào)函數(shù),當(dāng)內(nèi)核執(zhí)行完后將結(jié)果返回給應(yīng)用程序,所以不會(huì)出現(xiàn)Reactor的問(wèn)題
總結(jié)
以上是生活随笔為你收集整理的libevent源码学习-----Reactor模型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++学习笔记-----二分法之寻找非减
- 下一篇: libevent源码学习-----事件驱