Reactor 和 Proactor 的差異
以下將我學習到 reactor 和 proactor 的差異重點列出,
異步情況下(Proactor),當回調handler時,表示IO操作已經完成;同步情況下(Reactor),回調handler時,表示IO設備可以進行某個操作(can read or can write)。
首先它們都是IO復用下的事件驅動模型,然後就從同步異步這兩個點來切入概念。注意關鍵區別在於何時IO,reactor是關心就緒事件,比如可讀了,就通知你,就像epoll_wait 。proactor關心的是完成比如讀完了,就通知你。
Reactor模式,本質就是當IO事件(如讀寫事件)觸發時,通知我們主動去讀取,也就是要我們主動將socket接收緩存中的數據讀到應用進程內存中。Proactor模式,我們需要指定一個應用進程內的buffer(內存地址),交給系統,當有數據包到達時,則寫入到這個buffer並通知我們收了多少個字節。
libevent/libev/libuv/ZeroMQ/Event Library in Redis
底層使用 epoll
Proactor
IOCP (Windows IO completion port) / Boost.Asio
這張圖很仔細,在[1] 的回覆裡
[1] 如何深刻理解reactor和proactor? - 知乎
https://www.zhihu.com/question/26943938
[2] Reactor 和 Proactor 模式 - 程序園
http://www.voidcn.com/article/p-qeehqukm-bgd.html
[3] GitHub - song0071000/SimpleReactorImplemention: Reactor Pattern Implemention
https://github.com/song0071000/SimpleReactorImplemention
簡單的 Reactor 實做,使用C++
異步情況下(Proactor),當回調handler時,表示IO操作已經完成;同步情況下(Reactor),回調handler時,表示IO設備可以進行某個操作(can read or can write)。
首先它們都是IO復用下的事件驅動模型,然後就從同步異步這兩個點來切入概念。注意關鍵區別在於何時IO,reactor是關心就緒事件,比如可讀了,就通知你,就像epoll_wait 。proactor關心的是完成比如讀完了,就通知你。
Reactor模式,本質就是當IO事件(如讀寫事件)觸發時,通知我們主動去讀取,也就是要我們主動將socket接收緩存中的數據讀到應用進程內存中。Proactor模式,我們需要指定一個應用進程內的buffer(內存地址),交給系統,當有數據包到達時,則寫入到這個buffer並通知我們收了多少個字節。
函式庫
Reactor:libevent/libev/libuv/ZeroMQ/Event Library in Redis
底層使用 epoll
Proactor
IOCP (Windows IO completion port) / Boost.Asio
圖解
reactor和proactor主要是用來解決高並發的問題(ppc和tpc不能應對高並發),reactor的時序圖如下(這是最簡單的reactor,後面還有父子reactor,一個處理連接請求,一個做具體的請求操作)。這張圖很仔細,在[1] 的回覆裡
[1] 如何深刻理解reactor和proactor? - 知乎
https://www.zhihu.com/question/26943938
[2] Reactor 和 Proactor 模式 - 程序園
http://www.voidcn.com/article/p-qeehqukm-bgd.html
[3] GitHub - song0071000/SimpleReactorImplemention: Reactor Pattern Implemention
https://github.com/song0071000/SimpleReactorImplemention
簡單的 Reactor 實做,使用C++
留言
張貼留言