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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

ACE中的Proactor和Reactor

發(fā)布時(shí)間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ACE中的Proactor和Reactor 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ACE中的Proactor和Reactor



? ? ? ? ACE_Select_Reactor是除Windows之外所有平臺(tái)使用的默認(rèn)反應(yīng)器實(shí)現(xiàn),在這些系統(tǒng)上最終會(huì)用select()系統(tǒng)函數(shù)進(jìn)行等待。在Windows上ACE_WFMO_Reactor是默認(rèn)的反應(yīng)器實(shí)現(xiàn)。該實(shí)現(xiàn)沒(méi)有使用select()多路分離器,而是使用了WaitForMultipleObjects()。在使用ACE_WFMO_Reactor時(shí),需要一些權(quán)衡:ACE_WFMO_Reactor只能登記62個(gè)句柄。底層的WaitForMutipleObejcts()函數(shù)是64個(gè),ACE在內(nèi)部使用了其中的兩個(gè);I/O類型,ACE_WFMO_Reactor只在socket句柄上支持handler_input()、handler_output()和handler_exception()的I/O回調(diào);只要句柄能用于WaitForMultipleObjects(),ACE_WFMO_Reactor就能對(duì)其做出反應(yīng),比如文件變更通知句柄和事件句柄。

? ? ? ?ACE_WIN32_Proactor是Windows上的ACE_Proactor實(shí)現(xiàn),它使用I/O完成多口進(jìn)行完成事件檢測(cè)。在初始化異步操作工廠時(shí)(比如ACE_Asynch_Read_Stream或ACE_Aysnch_Write_Stream),I/O句柄會(huì)與Proactor的I/O完成端口關(guān)聯(lián)在一起。在這種實(shí)現(xiàn)里,Windows的GetQueuedCompletionStatus()函數(shù)用于執(zhí)行時(shí)間循環(huán)。多個(gè)線程可以同時(shí)執(zhí)行ACE_WIN32_Proactor時(shí)間循環(huán)。POSIX系統(tǒng)上的ACE?Proactor實(shí)現(xiàn)提供了多種用于發(fā)起I/O操作、并檢查其完成的機(jī)制。ACE所封裝的POSIX異步I/O機(jī)制支持read()和write()操作,但不支持與TCP/IP連接相關(guān)的操作,為了支持ACE_Asynch_Acceptro和ACE_Asynch_Connector的函數(shù),ACE使用了一個(gè)單獨(dú)的線程來(lái)執(zhí)行與連接有關(guān)的操作。因此,在POSIX平臺(tái)上使用Proactor框架時(shí),程序?qū)?huì)運(yùn)行多個(gè)線程。ACE的內(nèi)部機(jī)制使得你不用再多個(gè)線程中對(duì)時(shí)間進(jìn)行處理,所以你無(wú)需增加任何特殊的加鎖或同步。

? ? ? ? 首先想寫網(wǎng)絡(luò)處理程序,那么要清楚各個(gè)步驟的限制是什么,簡(jiǎn)單的說(shuō),肯定有讀取(寫)數(shù)據(jù),和處理數(shù)據(jù)兩個(gè)部分,那么這個(gè)兩個(gè)部分有什么特點(diǎn)呢?讀取數(shù)據(jù)主要是I/O操作,而單個(gè)的I/O操作可能會(huì)有等待,而且I/O操作對(duì)CPU的耗費(fèi)很少,最重要的是I/O速度與CPU速度比跟龜速差不多。一個(gè)線程就可以處理很多路的I/O操作,在一次I/O完成的時(shí)候會(huì)激活分離器,由分離器調(diào)用事件處理器。做個(gè)假設(shè),可能同時(shí)有1000個(gè)數(shù)據(jù)請(qǐng)求,如果不用reactor,那么可能會(huì)開啟1000個(gè)線程或者進(jìn)程進(jìn)行服務(wù),這個(gè)時(shí)候首先線程之間的切換和鎖開銷是非常大的,而如果采用reactor,可能會(huì)只用一個(gè)讀線程,輪流讀取這1000個(gè)請(qǐng)求,然后當(dāng)其中的一個(gè)讀取完成后,激活分離器,分離器調(diào)用事件處理器,這樣的話,如果系統(tǒng)處理數(shù)據(jù)很快的話,那么同時(shí)存在的線程可能很少,就減少了系統(tǒng)的線程創(chuàng)建切換和銷毀。

? ? ? ? 記得以前寫過(guò)的服務(wù)器程序,都是有一個(gè)讀取請(qǐng)求線程池,一個(gè)處理線程池,這樣的話其實(shí)和Reactor模式的原理差不多,把讀取和處理分離開來(lái),然后用一個(gè)消息隊(duì)列來(lái)完成讀取與處理的通信,這樣會(huì)用到鎖,鎖的設(shè)計(jì)不僅復(fù)雜而且會(huì)有系統(tǒng)開銷。但是Reactor沒(méi)有用鎖,只把一個(gè)buffer告訴分發(fā)器,當(dāng)讀取結(jié)束就回調(diào)處理handler。(在ACE中是否用鎖實(shí)現(xiàn)的不是很確定)而且,想剛才那樣設(shè)計(jì)交互就比較麻煩,如果光是讀還比較簡(jiǎn)單,但是讀到如果會(huì)送那么就比較麻煩了。

下面是別的博文上總結(jié)Reactor和Proactor的讀的過(guò)程:

在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)注的是完成事件。
- 事件分離器等待操作完成事件
- 在分離器等待過(guò)程中,操作系統(tǒng)利用并行的內(nèi)核線程執(zhí)行實(shí)際的讀操作,并將結(jié)果數(shù)據(jù)存入用戶自定義緩沖區(qū),最后通知事件分離器讀操作完成。
- 事件分離器呼喚處理器。
- 事件處理器處理用戶自定義緩沖區(qū)中的數(shù)據(jù),然后啟動(dòng)一個(gè)新的異步操作,并將控制權(quán)返回事件分離器


簡(jiǎn)單總結(jié)下相同點(diǎn)與不同點(diǎn):
相同點(diǎn)
1)都有Event Demutiplexer(為什么叫事件多路分離器呢?主要是從它的功能上看,它能夠把事件源的I/O時(shí)間分離出來(lái),并分發(fā)到對(duì)應(yīng)的read/write事件處理區(qū)(Event Handler)),負(fù)責(zé)回調(diào)handler。
2)讀(寫)數(shù)據(jù),與讀結(jié)束后處理為分開的兩個(gè)過(guò)程,這也是Reactor的重點(diǎn)所在,不用一個(gè)線程完成從讀數(shù)據(jù)一直到處理結(jié)束,讀數(shù)據(jù)線程和處理線程是兩個(gè)不同的線程。這樣做有個(gè)優(yōu)點(diǎn),因?yàn)樽x取數(shù)據(jù)可能會(huì)很耗費(fèi)時(shí)間,讀取其實(shí)瓶頸為系統(tǒng)的I/O,一個(gè)線程就可以處理很多路數(shù)據(jù)的I/O處理。

不同點(diǎn):
1)Proactor是在I/O操作完成才回調(diào)handler,而Reactor是在I/O可以進(jìn)行讀或?qū)懖僮鲿r(shí)候調(diào)用handler。
2)Proactor的讀寫是利用操作系統(tǒng)支持異步I/O讀寫操作完成的,而Reactor的I/O操作是由用戶完成的。
3)Reactor為同步的,需要用戶自己去執(zhí)行I/O操作然后等待I/O操作完成,在執(zhí)行某些操作,Proactor為異步的,發(fā)起I/O操作后就交給操作系統(tǒng)了,只關(guān)心IO完成事件。這里一開始理解有個(gè)小的誤區(qū),


? ? ? ? 其實(shí)Reactor和Proactor在等待I/O事件到來(lái)的時(shí)候都可以理解為異步的,可能都用到select()底層函數(shù),當(dāng)端口可操作時(shí)候由操作系統(tǒng)異步的通知,這個(gè)時(shí)候Reactor收到通知,調(diào)用handler。然而Proactor收到端口可操作的時(shí)候還不滿意,需要在I/O操作完成后再異步的通知,這樣Proactor相當(dāng)于兩層異步操作,而說(shuō)Reactor和Proactor的“異步”,指的為后面的I/O操作。

? ? ? ? “Reactor框架中用戶定義的操作是在實(shí)際操作之前調(diào)用的。比如你定義了操作是要向一個(gè)SOCKET寫數(shù)據(jù),那么當(dāng)該SOCKET可以接收數(shù)據(jù)的時(shí)候,你的操作就會(huì)被調(diào)用;而Proactor框架中用戶定義的操作是在實(shí)際操作之后調(diào)用的。比如你定義了一個(gè)操作要顯示從SOCKET中讀入的數(shù)據(jù),那么當(dāng)讀操作完成以后,你的操作才會(huì)被調(diào)用。”

參考:

http://www.cnblogs.com/dawen/archive/2011/05/18/2050358.html
http://name5566.com/4175.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的ACE中的Proactor和Reactor的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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