两种高效的事件处理模式
兩種I/O多路復(fù)用模式:Reactor和Proactor
一般地,I/O多路復(fù)用機(jī)制都依賴于一個(gè)事件多路分離器(Event Demultiplexer)。分離器對(duì)象可將來(lái)自事件源的I/O事件分離出來(lái),并分發(fā)到對(duì)應(yīng)的read/write事件處理器(Event Handler)。開發(fā)人員預(yù)先注冊(cè)需要處理的事件及其事件處理器(或回調(diào)函數(shù));事件分離器負(fù)責(zé)將請(qǐng)求事件傳遞給事件處理器。兩個(gè)與事件分離器有關(guān)的模式是Reactor和Proactor。Reactor模式采用同步IO,而Proactor采用異步IO。
在Reactor中,事件分離器負(fù)責(zé)等待文件描述符或socket為讀寫操作準(zhǔn)備就緒,然后將就緒事件傳遞給對(duì)應(yīng)的處理器,最后由處理器負(fù)責(zé)完成實(shí)際的讀寫工作。
而在Proactor模式中,處理器--或者兼任處理器的事件分離器,只負(fù)責(zé)發(fā)起異步讀寫操作。IO操作本身由操作系統(tǒng)來(lái)完成。傳遞給操作系統(tǒng)的參數(shù)需要包括用戶定義的數(shù)據(jù)緩沖區(qū)地址和數(shù)據(jù)大小,操作系統(tǒng)才能從中得到寫出操作所需數(shù)據(jù),或?qū)懭霃膕ocket讀到的數(shù)據(jù)。事件分離器捕獲IO操作完成事件,然后將事件傳遞給對(duì)應(yīng)處理器。比如,在windows上,處理器發(fā)起一個(gè)異步IO操作,再由事件分離器等待IOCompletion事件。典型的異步模式實(shí)現(xiàn),都建立在操作系統(tǒng)支持異步API的基礎(chǔ)之上,我們將這種實(shí)現(xiàn)稱為“系統(tǒng)級(jí)”異步或“真”異步,因?yàn)閼?yīng)用程序完全依賴操作系統(tǒng)執(zhí)行真正的IO工作。
舉個(gè)例子,將有助于理解Reactor與Proactor二者的差異,以讀操作為例(類操作類似)。
在Reactor中實(shí)現(xiàn)讀:
- 注冊(cè)讀就緒事件和相應(yīng)的事件處理器
- 事件分離器等待事件
- 事件到來(lái),激活分離器,分離器調(diào)用事件對(duì)應(yīng)的處理器。
- 事件處理器完成實(shí)際的讀操作,處理讀到的數(shù)據(jù),注冊(cè)新的事件,然后返還控制權(quán)。
在Proactor中實(shí)現(xiàn)讀:
- 處理器發(fā)起異步讀操作(注意:操作系統(tǒng)必須支持異步IO)。在這種情況下,處理器無(wú)視IO就緒事件,它關(guān)注的是完成事件。
- 事件分離器等待操作完成事件
- 在分離器等待過程中,操作系統(tǒng)利用并行的內(nèi)核線程執(zhí)行實(shí)際的讀操作,并將結(jié)果數(shù)據(jù)存入用戶自定義緩沖區(qū),最后通知事件分離器讀操作完成。
- 事件分離器呼喚處理器。
- 事件處理器處理用戶自定義緩沖區(qū)中的數(shù)據(jù),然后啟動(dòng)一個(gè)新的異步操作,并將控制權(quán)返回事件分離器。
可以看出,兩個(gè)模式的相同點(diǎn),都是對(duì)某個(gè)IO事件的事件通知(即告訴某個(gè)模塊,這個(gè)IO操作可以進(jìn)行或已經(jīng)完成)。在結(jié)構(gòu)上,兩者也有相同點(diǎn):demultiplexor負(fù)責(zé)提交IO操作(異步)、查詢?cè)O(shè)備是否可操作(同步),然后當(dāng)條件滿足時(shí),就回調(diào)handler;不同點(diǎn)在于,異步情況下(Proactor),當(dāng)回調(diào)handler時(shí),表示IO操作已經(jīng)完成;同步情況下(Reactor),回調(diào)handler時(shí),表示IO設(shè)備可以進(jìn)行某個(gè)操作(can read or can write)。
?
轉(zhuǎn)載于:https://www.cnblogs.com/13224ACMer/p/6624935.html
總結(jié)
以上是生活随笔為你收集整理的两种高效的事件处理模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HMM、MEMM、CRF模型比较和标注偏
- 下一篇: ASP.NET MVC IOC 之Aut