青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

loop_in_codes

低調(diào)做技術(shù)__歡迎移步我的獨(dú)立博客 codemaro.com 微博 kevinlynx

Proactor和Reactor模式_繼續(xù)并發(fā)系統(tǒng)設(shè)計(jì)的掃盲

6.6.2008

Kevin Lynx

Proactor和Reactor都是并發(fā)編程中的設(shè)計(jì)模式。在我看來,他們都是用于派發(fā)/分離IO操作事件的。這里所謂的
IO事件也就是諸如read/write的IO操作。"派發(fā)/分離"就是將單獨(dú)的IO事件通知到上層模塊。兩個模式不同的地方
在于,Proactor用于異步IO,而Reactor用于同步IO。

摘抄一些關(guān)鍵的東西:

"
Two patterns that involve event demultiplexors are called Reactor and Proactor [1]. The Reactor patterns
involve synchronous I/O, whereas the Proactor pattern involves asynchronous I/O.
"

關(guān)于兩個模式的大致模型,從以下文字基本可以明白:

"
An example will help you understand the difference between Reactor and Proactor. We will focus on the read
operation here, as the write implementation is similar. Here's a read in Reactor:

* An event handler declares interest in I/O events that indicate readiness for read on a particular socket ;
* The event demultiplexor waits for events ;
* An event comes in and wakes-up the demultiplexor, and the demultiplexor calls the appropriate handler;
* The event handler performs the actual read operation, handles the data read, declares renewed interest in
  I/O events, and returns control to the dispatcher .

By comparison, here is a read operation in Proactor (true async):

* A handler initiates an asynchronous read operation (note: the OS must support asynchronous I/O). In this
  case, the handler does not care about I/O readiness events, but is instead registers interest in receiving
  completion events;
* The event demultiplexor waits until the operation is completed ;
* While the event demultiplexor waits, the OS executes the read operation in a parallel kernel thread, puts
  data into a user-defined buffer, and notifies the event demultiplexor that the read is complete ;
* The event demultiplexor calls the appropriate handler;
* The event handler handles the data from user defined buffer, starts a new asynchronous operation, and returns
  control to the event demultiplexor.

"

可以看出,兩個模式的相同點(diǎn),都是對某個IO事件的事件通知(即告訴某個模塊,這個IO操作可以進(jìn)行或已經(jīng)完成)。在結(jié)構(gòu)
上,兩者也有相同點(diǎn):demultiplexor負(fù)責(zé)提交IO操作(異步)、查詢設(shè)備是否可操作(同步),然后當(dāng)條件滿足時,就回調(diào)handler。
不同點(diǎn)在于,異步情況下(Proactor),當(dāng)回調(diào)handler時,表示IO操作已經(jīng)完成;同步情況下(Reactor),回調(diào)handler時,表示
IO設(shè)備可以進(jìn)行某個操作(can read or can write),handler這個時候開始提交操作。

用select模型寫個簡單的reactor,大致為:

///
class handler
{
public:
    
virtual void onRead() = 0;
    
virtual void onWrite() = 0;
    
virtual void onAccept() = 0;
}


class dispatch
{
public:
    
void poll()
    
{
        
// add fd in the set.
        
//
        
// poll every fd
        int c = select( 0&read_fd, &write_fd, 00 );
        
if( c > 0 )
        
{
            
for each fd in the read_fd_set
            
{    if fd can read
                    _handler
->onRead();
                
if fd can accept
                    _handler
->onAccept();
            }
 

            
for each fd in the write_fd_set
            
{
                
if fd can write
                    _handler
->onWrite();
            }

        }

    }
 

    
void setHandler( handler *_h )
    
{
        _handler 
= _h;
    }
 

private:
    handler 
*_handler;
}


/// application
class MyHandler : public handler
{
public:
    
void onRead()
    
{
    }
 

    
void onWrite()
    
{
    }
 

    
void onAccept()
    
{
    }

}



在網(wǎng)上找了份Proactor模式比較正式的文檔,其給出了一個總體的UML類圖,比較全面:

proactor_uml

根據(jù)這份圖我隨便寫了個例子代碼:

class AsyIOProcessor
{
public:
    
void do_read()
    
{
        
//send read operation to OS
        
// read io finished.and dispatch notification
        _proactor->dispatch_read();
    }
 

private:
    Proactor 
*_proactor;
}


class Proactor
{
public:
    
void dispatch_read()
    
{
        _handlerMgr
->onRead();
    }
 

private:
    HandlerManager 
*_handlerMgr;
}


class HandlerManager
{
public:
    typedef std::list
<Handler*> HandlerList; 

public:
    
void onRead()
    
{
        
// notify all the handlers.
        std::for_each( _handlers.begin(), _handlers.end(), onRead );
    }
 

private:
    HandlerList 
*_handlers;
}


class Handler
{
public:
    
virtual void onRead() = 0;
}


// application level handler.
class MyHandler : public Handler
{
public:
    
void onRead() 
    
{
        
// 
    }

}



Reactor通過某種變形,可以將其改裝為Proactor,在某些不支持異步IO的系統(tǒng)上,也可以隱藏底層的實(shí)現(xiàn),利于編寫跨平臺
代碼。我們只需要在dispatch(也就是demultiplexor)中封裝同步IO操作的代碼,在上層,用戶提交自己的緩沖區(qū)到這一層,
這一層檢查到設(shè)備可操作時,不像原來立即回調(diào)handler,而是開始IO操作,然后將操作結(jié)果放到用戶緩沖區(qū)(讀),然后再
回調(diào)handler。這樣,對于上層handler而言,就像是proactor一樣。詳細(xì)技法參見這篇文章

其實(shí)就設(shè)計(jì)模式而言,我個人覺得某個模式其實(shí)是沒有完全固定的結(jié)構(gòu)的。不能說某個模式里就肯定會有某個類,類之間的
關(guān)系就肯定是這樣。在實(shí)際寫程序過程中也很少去特別地實(shí)現(xiàn)某個模式,只能說模式會給你更多更好的架構(gòu)方案。

最近在看spserver的代碼,看到別人提各種并發(fā)系統(tǒng)中的模式,有點(diǎn)眼紅,于是才來掃掃盲。知道什么是leader follower模式
reactor, proactor,multiplexing,對于心中的那個網(wǎng)絡(luò)庫也越來越清晰。

最近還干了些離譜的事,寫了傳說中的字節(jié)流編碼,用模板的方式實(shí)現(xiàn),不但保持了擴(kuò)展性,還少寫很多代碼;處于效率考慮,
寫了個static array容器(其實(shí)就是template <typename _Tp, std::size_t size> class static_array { _Tp _con[size]),
加了iterator,遵循STL標(biāo)準(zhǔn),可以結(jié)合進(jìn)STL的各個generic algorithm用,自我感覺不錯。基礎(chǔ)模塊搭建完畢,解析了公司
服務(wù)器網(wǎng)絡(luò)模塊的消息,我是不是真的打算用自己的網(wǎng)絡(luò)模塊重寫我的驗(yàn)證服務(wù)器?在另一個給公司寫的工具里,因?yàn)閷?shí)在厭惡
越來越多的重復(fù)代碼,索性寫了幾個宏,還真的做到了代碼的自動生成:D。

對優(yōu)雅代碼的追求真的成了種癖好.  = =|

posted on 2008-06-06 13:25 Kevin Lynx 閱讀(29609) 評論(7)  編輯 收藏 引用 所屬分類: network模塊架構(gòu)

評論

# re: Proactor和Reactor模式_繼續(xù)并發(fā)系統(tǒng)設(shè)計(jì)的掃盲 2008-06-06 15:13 關(guān)中刀客

模式是個好東西,但不是絕對的好東西,有時也不是很必要使用proactor  回復(fù)  更多評論   

# re: Proactor和Reactor模式_繼續(xù)并發(fā)系統(tǒng)設(shè)計(jì)的掃盲 2008-06-06 15:40 Kevin Lynx

@關(guān)中刀客
傳說哥們和我同年同月差一天就同日生(我10號:d)

還有,一直想看下你的cobra是個什么東西  回復(fù)  更多評論   

# re: Proactor和Reactor模式_繼續(xù)并發(fā)系統(tǒng)設(shè)計(jì)的掃盲 2008-06-06 16:43 關(guān)中刀客

To Kevin Lynx兄:
呵呵,有緣有緣,我的cobra_win是一個網(wǎng)絡(luò)通訊庫,主要是針對iocp,采用異步多線程,底層目前已經(jīng)有了自己的一套內(nèi)存管理策略,比較完善的日志模快,定時器模塊等等,感覺對于底層來說,已經(jīng)相對的完善了,現(xiàn)在需要做的就是多多的改進(jìn)和修正很多東西。呵呵,以后可以多多的交流~  回復(fù)  更多評論   

# re: Proactor和Reactor模式_繼續(xù)并發(fā)系統(tǒng)設(shè)計(jì)的掃盲 2008-06-06 17:19 Kevin Lynx

@關(guān)中刀客
難道不開源?不知道能否分享下代碼。

我之前在google,baidu都搜索過你這個東西,沒有發(fā)現(xiàn)類似googlecode之類的項(xiàng)目地址。。  回復(fù)  更多評論   

# re: Proactor和Reactor模式_繼續(xù)并發(fā)系統(tǒng)設(shè)計(jì)的掃盲 2008-06-11 14:15 胡章優(yōu)

寫的很不錯
這兩個模式在服務(wù)器開發(fā)中是應(yīng)用的最多的算是

另外一點(diǎn)開發(fā)的重點(diǎn)在集群管理上面

刀客的東西可能想商業(yè)化,并沒有開源的打算  回復(fù)  更多評論   

# re: Proactor和Reactor模式_繼續(xù)并發(fā)系統(tǒng)設(shè)計(jì)的掃盲[未登錄] 2008-06-12 19:25 楊粼波

IOCP就是Proactor實(shí)現(xiàn)的系統(tǒng)級的事件分離器。

leader follower模式,是一種并發(fā)模式,也可以說是一種策略。
這些都可以在ACE的那兩本網(wǎng)絡(luò)編程的書里面看到講解。
我最近一直看這書,一邊寫自己的網(wǎng)絡(luò)庫。之前寫的不滿意,現(xiàn)在重新寫一個。嘗試先用UML建模的方法。  回復(fù)  更多評論   

# re: Proactor和Reactor模式_繼續(xù)并發(fā)系統(tǒng)設(shè)計(jì)的掃盲 2008-12-01 21:13 峰lntu

proactor 很好用  回復(fù)  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区三区高清在线| 国产真实久久| 国产视频一区欧美| 日韩视频在线观看国产| 久久久国产91| 一本一道久久综合狠狠老精东影业 | 欧美一区二区在线视频| 欧美日韩亚洲一区三区| 亚洲电影免费| 久久亚洲不卡| 亚洲欧美视频在线| 欧美午夜国产| 玖玖玖国产精品| 国产精品外国| 亚洲视频国产视频| 亚洲电影在线看| 欧美伊人精品成人久久综合97| 欧美日韩在线视频一区二区| 亚洲黄色有码视频| 免费视频最近日韩| 久久精品91久久香蕉加勒比| 国产女主播一区二区三区| 亚洲永久在线| 亚洲精品一区二区三区99| 欧美不卡视频一区发布| 在线日韩成人| 欧美1区视频| 久久精品中文字幕一区| 国产日韩欧美三区| 欧美一区二区三区另类| 亚洲午夜羞羞片| 国产精品久久久久一区二区| 亚洲一区国产一区| 日韩视频在线免费观看| 欧美日韩高清在线| 在线综合亚洲| 一本色道久久综合亚洲精品婷婷| 欧美日韩国产成人在线| 99精品热视频| 亚洲乱码国产乱码精品精天堂 | 午夜国产精品视频免费体验区| 久久国产精品久久久久久电车 | 国产精品久久久久久久久久三级| 一本色道久久综合狠狠躁篇的优点| 亚洲高清电影| 欧美国产91| 99视频精品免费观看| 亚洲精品久久久久久一区二区 | 久久精品最新地址| 欧美亚洲视频| 狠狠久久综合婷婷不卡| 久久这里有精品视频| 久久久久免费观看| 亚洲激情小视频| 最新国产乱人伦偷精品免费网站| 亚洲欧美日韩系列| 国产欧美婷婷中文| 久久亚洲一区| 六月婷婷一区| 亚洲美女在线看| 9l视频自拍蝌蚪9l视频成人| 国产精品久久久久久久久免费樱桃| 性欧美1819性猛交| 欧美一区亚洲二区| 亚洲国产经典视频| 亚洲精品在线视频观看| 欧美午夜不卡| 久久精品噜噜噜成人av农村| 久久蜜桃av一区精品变态类天堂| 亚洲精品四区| 亚洲午夜羞羞片| 一区二区视频免费完整版观看| 欧美成人亚洲成人| 欧美精品一区二区三区在线播放| 亚洲影音先锋| 欧美在线一区二区| 亚洲精品国产精品乱码不99| 一区二区不卡在线视频 午夜欧美不卡在 | 在线视频欧美一区| 国产欧美一区二区精品性色| 久久在线视频在线| 欧美理论视频| 欧美在线关看| 免费精品99久久国产综合精品| 亚洲视频香蕉人妖| 欧美一区三区二区在线观看| 亚洲人成啪啪网站| 亚洲午夜一区二区| 在线欧美日韩| 99伊人成综合| 狠狠色噜噜狠狠色综合久 | 免费观看不卡av| 亚洲视频碰碰| 久久riav二区三区| 99re66热这里只有精品4| 亚洲专区在线视频| 亚洲国产一二三| 亚洲在线中文字幕| 最新国产の精品合集bt伙计| 亚洲在线一区| 最新亚洲视频| 亚洲免费视频观看| 亚洲精品少妇30p| 午夜日韩激情| 中文国产成人精品| 久久久久成人精品免费播放动漫| 国产精品99久久不卡二区| 久久精品在线视频| 午夜精品www| 欧美黄色精品| 快she精品国产999| 欧美日韩国产丝袜另类| 免费成人小视频| 国产精品婷婷午夜在线观看| 亚洲啪啪91| 伊人色综合久久天天五月婷| 亚洲无亚洲人成网站77777 | 欧美ed2k| 国产美女一区二区| 亚洲人成网在线播放| 精品99一区二区三区| 亚洲视频欧洲视频| 亚洲精品在线视频观看| 久久精品在线观看| 欧美影院视频| 欧美日韩在线不卡| 亚洲大胆人体在线| 美国成人毛片| 欧美一区二区在线免费观看| 欧美精品亚洲精品| 麻豆成人小视频| 国产欧美一区二区精品忘忧草| 日韩亚洲欧美成人| 亚洲欧洲中文日韩久久av乱码| 羞羞答答国产精品www一本| 亚洲特黄一级片| 欧美激情欧美激情在线五月| 免费一级欧美片在线观看| 国产欧美亚洲精品| 亚洲图色在线| 亚洲午夜一二三区视频| 欧美国产91| 欧美激情中文不卡| 伊人久久亚洲影院| 久久疯狂做爰流白浆xx| 欧美一区二区在线| 国产精品久久激情| 一个色综合导航| 亚洲夜晚福利在线观看| 欧美日韩国产一中文字不卡| 亚洲黄色片网站| 亚洲黄色一区二区三区| 老**午夜毛片一区二区三区| 久久一综合视频| 韩国欧美一区| 久久国产视频网| 久久久欧美精品sm网站| 国产日韩一区| 欧美在线视频一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 国产欧美精品日韩区二区麻豆天美| 一区二区三区鲁丝不卡| 亚洲视频第一页| 国产精品va在线| 中文国产一区| 亚洲欧美区自拍先锋| 欧美午夜精品一区| 一区二区av在线| 午夜精品久久久久久久99樱桃| 欧美三级在线| 一区二区三区日韩| 亚洲欧美国产精品桃花| 欧美三区美女| 亚洲网站视频福利| 欧美一区视频| 国产一区二区毛片| 久久aⅴ国产紧身牛仔裤| 老鸭窝毛片一区二区三区| 尤物yw午夜国产精品视频| 久久综合九九| 亚洲欧洲精品一区二区三区| 一区二区欧美日韩| 欧美系列亚洲系列| 亚洲综合日韩中文字幕v在线| 欧美综合国产| 一区二区三区在线观看欧美| 久久亚洲欧美| 亚洲国产精品嫩草影院| 日韩亚洲综合在线| 欧美午夜理伦三级在线观看| 亚洲一级在线| 久久一区视频| 亚洲精品视频在线看| 欧美日韩亚洲一区二区三区在线 | 亚洲二区在线观看| 日韩视频一区二区在线观看 | 亚洲桃花岛网站| 国产精品一区二区久久久久| 小黄鸭视频精品导航| 久久综合久色欧美综合狠狠|