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

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 閱讀(29608) 評論(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>
            麻豆久久精品| 国产一区二区三区丝袜| 亚洲视频在线观看一区| 亚洲精品一区二区网址 | 欧美日韩综合另类| 欧美国产1区2区| 欧美极品aⅴ影院| 欧美日韩国产成人高清视频| 欧美久久综合| 国产精品嫩草久久久久| 91久久嫩草影院一区二区| 黄网站免费久久| 亚洲高清av| 亚洲精品在线视频| 亚洲一区二区三区中文字幕在线| 亚洲一区二区三区在线看| 亚洲欧美视频在线| 久久久精品动漫| 亚洲电影免费在线| 一本色道久久综合亚洲91| 午夜欧美大尺度福利影院在线看| 久久国产精品久久国产精品| 美女黄毛**国产精品啪啪| 欧美国产日韩在线| 国产精品久久久久久久第一福利| 国产综合久久久久影院| 亚洲精品视频在线| 欧美在线播放一区二区| 亚洲福利专区| 亚洲欧美资源在线| 欧美精品一区二区三区一线天视频 | 免费欧美电影| 国产精品一区免费观看| 91久久综合亚洲鲁鲁五月天| 亚洲丝袜av一区| 美女精品自拍一二三四| 在线一区二区三区四区| 欧美a级片网| 国内视频一区| 西瓜成人精品人成网站| 最近中文字幕mv在线一区二区三区四区| 宅男精品视频| 欧美精品1区2区| 在线播放日韩| 久久激情视频| 亚洲女同同性videoxma| 欧美精品亚洲精品| 亚洲激情国产| 欧美大片一区二区三区| 久久国产精品色婷婷| 国产精品夜夜夜| 亚洲午夜精品在线| 日韩午夜激情电影| 欧美日韩国产高清| 99在线|亚洲一区二区| 亚洲高清三级视频| 欧美福利视频| 亚洲久色影视| 亚洲娇小video精品| 欧美国产日韩一区| 一区二区免费在线观看| 亚洲人精品午夜| 欧美久久电影| 国内精品99| 欧美成年人视频网站| 国产精品一区久久| 欧美一区二区三区四区视频 | 欧美福利在线| 久久久久欧美精品| 韩日精品视频| 老**午夜毛片一区二区三区| 久久久久88色偷偷免费| 国精品一区二区| 免费欧美在线| 欧美成在线视频| 亚洲视频免费在线| 午夜久久福利| 亚洲成人在线视频播放| 欧美激情bt| 欧美性事免费在线观看| 欧美一区二区女人| 久久成人久久爱| 91久久久久久久久久久久久| 亚洲欧洲一区二区天堂久久| 欧美性猛交一区二区三区精品| 午夜伦理片一区| 久久久久一区二区三区| 亚洲精品日韩在线| 亚洲一区精品电影| 在线看一区二区| 亚洲国产毛片完整版| 欧美日韩亚洲激情| 久久精品亚洲精品国产欧美kt∨| 久久久免费精品视频| 99这里有精品| 亚洲一区二区视频在线| 国产主播一区二区三区| 最新国产成人av网站网址麻豆| 欧美日韩极品在线观看一区| 久久精品五月婷婷| 欧美精品在线网站| 久久婷婷蜜乳一本欲蜜臀| 欧美人交a欧美精品| 久久精品国产免费观看| 美女诱惑一区| 性欧美1819性猛交| 欧美不卡在线| 久久国产欧美| 欧美日韩免费一区二区三区视频| 久久久福利视频| 欧美日韩 国产精品| 久久野战av| 欧美色播在线播放| 亚洲第一精品久久忘忧草社区| 国产精品欧美一区二区三区奶水| 欧美国产日韩a欧美在线观看| 国产精品高潮久久| 亚洲国产精品一区二区www| 国内视频精品| 欧美一区二区在线播放| 亚洲一区二区三区欧美| 欧美国产成人精品| 嫩模写真一区二区三区三州| 国产日韩欧美二区| 亚洲欧美激情视频| 性感少妇一区| 国产主播一区二区三区| 亚洲午夜久久久久久久久电影院| 亚洲黄色影片| 快射av在线播放一区| 欧美一区二区三区精品电影| 欧美日韩专区| 亚洲欧洲日产国产网站| 亚洲第一精品影视| 久久精品理论片| 欧美一区三区三区高中清蜜桃| 欧美香蕉大胸在线视频观看| 99精品视频免费在线观看| 日韩亚洲国产精品| 欧美激情自拍| 亚洲精品日韩精品| 亚洲精品免费看| 裸体素人女欧美日韩| 欧美成人免费小视频| 亚洲福利在线看| 猛男gaygay欧美视频| 亚洲国产天堂久久综合网| 亚洲国产精品成人一区二区| 欧美在线|欧美| 久久精品视频99| 在线观看国产精品淫| 麻豆成人综合网| 亚洲韩国青草视频| 正在播放欧美视频| 国产精品久久午夜夜伦鲁鲁| 亚洲在线中文字幕| 久久久久成人精品| 亚洲国产高潮在线观看| 欧美激情无毛| 亚洲视频在线一区| 久久日韩粉嫩一区二区三区| 亚洲国产日韩欧美综合久久| 欧美风情在线| 一区二区欧美亚洲| 久久av一区二区三区亚洲| 在线成人激情| 欧美日韩国产综合网| 午夜影院日韩| 欧美激情久久久久| 亚洲自拍都市欧美小说| 国内精品国产成人| 欧美女激情福利| 午夜欧美不卡精品aaaaa| 欧美成人视屏| 午夜欧美精品| 最新国产の精品合集bt伙计| 国产精品国产三级欧美二区| 久久另类ts人妖一区二区| 亚洲精品人人| 美日韩精品免费| 亚洲在线一区二区三区| 亚洲国产精品一区二区www在线| 欧美人与性动交a欧美精品| 亚洲欧美日韩国产综合精品二区| 欧美国产日本| 久久久欧美一区二区| 亚洲线精品一区二区三区八戒| 在线成人av网站| 国产日韩综合| 国产精品成人在线观看| 欧美成人在线影院| 欧美影院成年免费版| 在线视频精品一区| 亚洲成人在线视频播放| 国产精品美女在线| 欧美激情在线观看| 玖玖在线精品| 久久久免费精品视频| 国产精品视频内| 欧美激情一区在线观看|