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

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>
            亚洲精品一区二区在线观看| 欧美精品色网| 蜜桃精品久久久久久久免费影院| 久久久噜噜噜久久久| 欧美国产精品中文字幕| 欧美视频久久| 合欧美一区二区三区| 亚洲啪啪91| 久久精彩免费视频| 亚洲黄色一区二区三区| 亚洲视频自拍偷拍| 玖玖视频精品| 国产精品亚洲综合色区韩国| 亚洲成色777777女色窝| 一区二区激情| 麻豆精品91| 亚洲性夜色噜噜噜7777| 另类图片综合电影| 国产日产亚洲精品系列| 中文亚洲字幕| 欧美成人免费一级人片100| 在线一区二区三区四区| 免费h精品视频在线播放| 国产精品乱码一区二区三区 | 亚洲高清色综合| 亚洲一区在线直播| 欧美精品成人91久久久久久久| 国产三级欧美三级日产三级99| 一区二区三区高清在线观看| 蜜臀av性久久久久蜜臀aⅴ| 亚洲一区二区四区| 欧美三日本三级少妇三2023| 日韩视频在线观看免费| 欧美黄色视屏| 久久久久久久久蜜桃| 国产欧美日韩精品一区| 亚洲免费婷婷| 一区二区三区久久| 欧美视频在线观看视频极品 | 欧美精品综合| 亚洲乱码国产乱码精品精可以看| 免费日韩av片| 免费观看日韩| 怡红院av一区二区三区| 久久这里只有| 久久男女视频| 在线精品亚洲| 奶水喷射视频一区| 免费久久99精品国产自| 亚洲国产精品一区二区第四页av| 免播放器亚洲| 免播放器亚洲| 亚洲乱码国产乱码精品精98午夜 | 亚洲一区二区三区高清不卡| 亚洲日产国产精品| 欧美色综合网| 久久成人羞羞网站| 久久精品视频网| 亚洲高清影视| 亚洲欧洲精品成人久久奇米网| 欧美乱大交xxxxx| 亚洲午夜激情网站| 亚洲欧美成人一区二区三区| 国产视频一区三区| 欧美激情小视频| 欧美精品在欧美一区二区少妇| 亚洲素人在线| 欧美一级在线播放| 91久久香蕉国产日韩欧美9色| 亚洲欧洲一区二区在线播放| 欧美少妇一区| 久久久蜜桃一区二区人| 久久综合电影| 亚洲午夜视频在线观看| 午夜精品视频| 亚洲另类一区二区| 午夜精品一区二区三区电影天堂 | 国产精品mv在线观看| 欧美亚洲午夜视频在线观看| 久久三级视频| 亚洲伊人久久综合| 久久久久99精品国产片| 亚洲精品国产精品国自产在线| 亚洲精品视频在线观看免费| 国产欧美高清| 亚洲人成在线观看一区二区| 国产亚洲精品bt天堂精选| 亚洲国产精品热久久| 国产精品扒开腿爽爽爽视频| 免费看av成人| 国产精品丝袜久久久久久app| 欧美.日韩.国产.一区.二区| 国产精品福利在线观看网址| 免费欧美日韩| 国产精品一区亚洲| 亚洲欧洲一区二区三区在线观看 | 欧美精品亚洲| 久久人人精品| 国产精品蜜臀在线观看| 亚洲国产婷婷综合在线精品 | 亚洲欧美一区二区激情| 亚洲国产国产亚洲一二三| 亚洲视频在线观看三级| 亚洲日本中文字幕免费在线不卡| 午夜欧美大片免费观看| 亚洲一区二区日本| 欧美日韩成人综合| 亚洲第一网站| 亚洲国产91| 欧美中文字幕不卡| 欧美在线|欧美| 欧美午夜激情小视频| 亚洲三级网站| 99精品欧美一区二区三区综合在线| 久久九九有精品国产23| 久久精品国产69国产精品亚洲 | 亚洲网站在线播放| 一本久久综合亚洲鲁鲁| 欧美激情一级片一区二区| 欧美顶级艳妇交换群宴| 在线观看亚洲视频| 久久久久88色偷偷免费| 久久尤物电影视频在线观看| 国产欧美日韩精品专区| 亚洲欧美视频在线观看| 欧美一区二区三区成人| 国产精品爽黄69| 亚洲欧美乱综合| 久久99在线观看| 国产亚洲成人一区| 欧美一区二区三区视频| 欧美一区影院| 国产色爱av资源综合区| 欧美一区三区二区在线观看| 久久精品国产清高在天天线| 国内自拍视频一区二区三区| 久久久久久网站| 欧美国产大片| 99在线精品观看| 国产精品久久久久久久午夜片| 亚洲视频免费看| 久久精品中文| 最新日韩欧美| 国产精品vvv| 欧美一级久久久| 欧美第一黄网免费网站| 一本到高清视频免费精品| 国产精品h在线观看| 久久国产精品亚洲77777| 欧美国产高清| 亚洲欧美视频一区二区三区| 国产欧美精品久久| 久久亚洲综合| 一区二区三区 在线观看视频| 欧美在线视频一区| 91久久久久久久久| 国产精品一区久久久| 久久精品一本| av不卡在线观看| 久久综合电影| 亚洲无线一线二线三线区别av| 国产区日韩欧美| 欧美精品久久久久久久久久| 午夜天堂精品久久久久| 亚洲第一福利视频| 欧美一级淫片aaaaaaa视频| 亚洲成人资源| 国产日韩欧美中文| 欧美精品久久久久久久久老牛影院| 亚洲永久免费视频| 亚洲国产一区二区视频 | 国产欧美日韩激情| 欧美成人高清| 久久国产精品一区二区三区| 亚洲青色在线| 欧美电影免费网站| 久久久91精品国产一区二区三区 | 国产精品资源| 欧美精品一区在线| 久久综合伊人77777蜜臀| 香蕉久久a毛片| 亚洲图片欧洲图片av| 亚洲观看高清完整版在线观看| 久久爱www.| 欧美在线日韩在线| 亚洲一区二区三区在线播放| 亚洲精品欧美专区| 在线观看不卡| 激情久久久久久| 国产女主播视频一区二区| 国产精品啊v在线| 欧美日韩一区二区三区在线观看免 | 这里只有精品丝袜| 亚洲国产综合在线看不卡| 国产日韩综合一区二区性色av| 欧美午夜精品久久久久免费视| 欧美大片免费看| 欧美不卡视频一区| 欧美国产欧美综合| 欧美大尺度在线观看|