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

loop_in_codes

低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

Proactor和Reactor模式_繼續并發系統設計的掃盲

6.6.2008

Kevin Lynx

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

摘抄一些關鍵的東西:

"
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.
"

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

"
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.

"

可以看出,兩個模式的相同點,都是對某個IO事件的事件通知(即告訴某個模塊,這個IO操作可以進行或已經完成)。在結構
上,兩者也有相同點:demultiplexor負責提交IO操作(異步)、查詢設備是否可操作(同步),然后當條件滿足時,就回調handler。
不同點在于,異步情況下(Proactor),當回調handler時,表示IO操作已經完成;同步情況下(Reactor),回調handler時,表示
IO設備可以進行某個操作(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()
    
{
    }

}



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

proactor_uml

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

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的系統上,也可以隱藏底層的實現,利于編寫跨平臺
代碼。我們只需要在dispatch(也就是demultiplexor)中封裝同步IO操作的代碼,在上層,用戶提交自己的緩沖區到這一層,
這一層檢查到設備可操作時,不像原來立即回調handler,而是開始IO操作,然后將操作結果放到用戶緩沖區(讀),然后再
回調handler。這樣,對于上層handler而言,就像是proactor一樣。詳細技法參見這篇文章

其實就設計模式而言,我個人覺得某個模式其實是沒有完全固定的結構的。不能說某個模式里就肯定會有某個類,類之間的
關系就肯定是這樣。在實際寫程序過程中也很少去特別地實現某個模式,只能說模式會給你更多更好的架構方案。

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

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

對優雅代碼的追求真的成了種癖好.  = =|

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

評論

# re: Proactor和Reactor模式_繼續并發系統設計的掃盲 2008-06-06 15:13 關中刀客

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

# re: Proactor和Reactor模式_繼續并發系統設計的掃盲 2008-06-06 15:40 Kevin Lynx

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

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

# re: Proactor和Reactor模式_繼續并發系統設計的掃盲 2008-06-06 16:43 關中刀客

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

# re: Proactor和Reactor模式_繼續并發系統設計的掃盲 2008-06-06 17:19 Kevin Lynx

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

我之前在google,baidu都搜索過你這個東西,沒有發現類似googlecode之類的項目地址。。  回復  更多評論   

# re: Proactor和Reactor模式_繼續并發系統設計的掃盲 2008-06-11 14:15 胡章優

寫的很不錯
這兩個模式在服務器開發中是應用的最多的算是

另外一點開發的重點在集群管理上面

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

# re: Proactor和Reactor模式_繼續并發系統設計的掃盲[未登錄] 2008-06-12 19:25 楊粼波

IOCP就是Proactor實現的系統級的事件分離器。

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

# re: Proactor和Reactor模式_繼續并發系統設計的掃盲 2008-12-01 21:13 峰lntu

proactor 很好用  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品永久免费在线| 久久久久久尹人网香蕉| 亚洲精品影视| 亚洲美女在线观看| 久久久午夜视频| 国产精品久久久久99| 亚洲精品欧美一区二区三区| 久久一区激情| 欧美一区影院| 国产精品中文字幕欧美| 亚洲一二三区视频在线观看| 亚洲国产成人在线播放| 欧美中文字幕不卡| 国产精品私拍pans大尺度在线| 99精品热视频只有精品10| 欧美成人69av| 久久综合久久88| 伊人久久婷婷色综合98网| 欧美在线视频播放| 欧美中文在线字幕| 狠狠色狠狠色综合日日tαg| 欧美一区二区三区视频免费播放| 中文久久精品| 国产精品日本一区二区| 午夜欧美电影在线观看| 亚洲欧美日韩在线不卡| 国产农村妇女精品| 欧美一区影院| 欧美亚洲免费在线| 红桃视频一区| 美女脱光内衣内裤视频久久影院 | 亚洲第一页自拍| 久久在线视频在线| 亚洲片在线观看| 91久久精品www人人做人人爽| 欧美激情1区2区3区| 一区二区三区欧美成人| 一区二区激情| 国产九九精品| 美国十次成人| 欧美激情中文不卡| 午夜精品免费| 久久久久国色av免费看影院| 亚洲人成在线观看| 一区二区三区波多野结衣在线观看| 国产精品久久久久aaaa樱花| 久久精品一级爱片| 蜜桃av一区二区三区| 一本大道久久a久久精二百| 久久精品国产亚洲一区二区三区| 精品成人一区二区| 亚洲精品资源美女情侣酒店| 久久国产精品亚洲77777| 亚洲国产精品女人久久久| 最新国产成人av网站网址麻豆| 欧美特黄一级| 久久亚洲欧美| 欧美日韩精品久久久| 久久久久看片| 亚洲一区二区三区午夜| 亚洲高清自拍| 亚洲私人影吧| 亚洲黄色在线| 亚洲欧美日韩天堂一区二区| 亚洲激情第一页| 午夜视频一区| 亚洲视频精品| 免费不卡亚洲欧美| 久久成人免费网| 欧美三区在线视频| 亚洲电影在线免费观看| 国产区精品在线观看| 91久久午夜| 精品96久久久久久中文字幕无| 99精品国产99久久久久久福利| 激情国产一区二区| 亚洲无线观看| av成人免费在线观看| 久久一区二区三区国产精品| 欧美一级精品大片| 国产精品大全| 亚洲欧洲日产国产综合网| 伊人久久大香线蕉综合热线| 亚洲女性裸体视频| 这里只有精品丝袜| 欧美福利电影网| 欧美成人在线免费视频| 国产一区二区三区av电影| 亚洲手机在线| 亚洲欧美在线x视频| 欧美日韩国产综合新一区| 免费在线观看日韩欧美| 国产视频一区欧美| 亚洲欧洲av一区二区| 午夜亚洲性色福利视频| 欧美亚韩一区| av不卡免费看| 亚洲午夜激情| 欧美精品在线观看播放| 亚洲国产婷婷综合在线精品| 在线观看一区欧美| 久久婷婷激情| 美女网站在线免费欧美精品| 在线欧美福利| 欧美wwwwww| 亚洲精品一区二区三区av| 在线亚洲电影| 国产精品海角社区在线观看| 亚洲一区中文| 久久久久在线观看| 在线不卡中文字幕播放| 你懂的视频一区二区| 亚洲精品乱码久久久久久蜜桃91| 一区二区三区久久| 国产精品毛片在线| 一区二区不卡在线视频 午夜欧美不卡在 | 午夜精品婷婷| 国产精品一级久久久| 欧美亚洲三级| 女主播福利一区| 一区二区日韩伦理片| 国产精品国色综合久久| 久久精品91久久香蕉加勒比| 欧美大片一区二区三区| 一区二区三区四区精品| 国产精品夜色7777狼人 | 欧美成人午夜77777| 一本大道久久精品懂色aⅴ| 欧美在线一级va免费观看| 在线日韩一区二区| 欧美网站大全在线观看| 欧美一级视频精品观看| 亚洲人体一区| 欧美怡红院视频| 亚洲日韩欧美视频| 国产欧美 在线欧美| 欧美国产大片| 欧美一区二区三区在线看| 亚洲精品视频一区二区三区| 久久国产色av| 一区二区三区成人精品| 极品尤物一区二区三区| 欧美小视频在线| 看片网站欧美日韩| 欧美一区高清| 一区二区三区日韩欧美| 欧美成人中文字幕在线| 欧美一区二区三区在线看| 99国产精品久久久久久久久久 | 亚洲欧美成aⅴ人在线观看| 亚洲国产高清在线| 国产精品美女黄网| 久久久久久久久久久久久9999| 日韩亚洲不卡在线| 欧美va亚洲va香蕉在线| 国外成人在线视频网站| 国产精品v欧美精品∨日韩| 久久精品91| 午夜视频在线观看一区| 亚洲精品久久久久久久久久久久久 | 91久久久国产精品| 久久免费国产精品| 亚洲视频在线免费观看| 日韩一区二区精品葵司在线| 国产一区二区成人久久免费影院| 欧美ab在线视频| 久久精品99国产精品| 午夜久久美女| 日韩视频在线观看免费| 欧美成人dvd在线视频| 欧美一区二区三区四区夜夜大片 | 亚洲国产精品激情在线观看| 亚洲欧美高清| 在线欧美视频| 国产亚洲视频在线观看| 国产欧美日韩在线观看| 欧美www视频| 久久久精彩视频| 亚洲欧美视频一区| 欧美福利电影在线观看| 欧美成人情趣视频| 久久久久久亚洲精品不卡4k岛国| 亚洲综合欧美| 一区二区三区欧美| 亚洲精品女人| 亚洲人屁股眼子交8| 有码中文亚洲精品| 国产一区二区精品| 在线观看视频欧美| 一区二区自拍| 黄色在线一区| 国产日韩在线一区| 一色屋精品视频在线看| 红桃视频国产一区| 狠狠色狠狠色综合系列| 黄色成人av在线| 亚洲精品一级| 亚洲精品视频免费在线观看| 亚洲人午夜精品| 亚洲国产精品欧美一二99|