常見的IO事件處理模型有兩種:Reactor和Proactor,Redis中的ae就是采用的Reactor事件處理模型,Proactor需要作業系統的支持,目前暫時還沒接觸到相關的使用場景,主要是學習模型結構,
Reactor模型

- Handler:用來標識一個檔案描述符
- Synchronous Event Demultiplexer:同步事件多路分解器,由select、poll或者epoll函式來實作,呼叫后會阻塞,直到等待Handler上的一個或多個事件發生
- Event Handler:事件處理介面
- Concrete Event Handler:事件處理介面的實作類,用來實作應用程式所提供的特定事件處理邏輯
- Reactor:Reactor反應堆,主要實作以下功能:
1)注冊和洗掉關注的檔案描述符
2)運行事件回圈
3)有就緒事件到來時,分發事件到之前注冊的回呼函式上處理
Reactor時序圖

- 運行主程式,將關注的事件handler注冊到Reactor中
- 主程式呼叫Reactor,進入無限事件回圈,等待注冊的事件到來
- 當事件到來時,呼叫select回傳待處理的事件,Reactor將事件分發到之前注冊的回呼函式中去處理
Proactor模型

- Handler:用來標識一個檔案描述符;
- Asynchronous Operation Processor:異步操作處理器,負責執行異步操作(一般由作業系統內核實作)
- Asynchronous Operation:異步操作
- Completion Event Queue:完成事件佇列,將異步操作完成的結果放到佇列中
- Proactor:主動器,從完成事件佇列中取出結果,分發呼叫相應的后續處理邏輯
- Completion Handler:完成事件介面
- Concrete Completion Handler:完成事件介面的實作類,用來實作應用程式所提供的特定事件處理邏輯
Proactor時序圖

- 應用程式(Initiator)呼叫異步操作處理器(Asynchronous Operation Processor)提供的異步操作介面函式,呼叫之后應用程式和異步操作處理就獨立運行
- 應用程式(Initiator)呼叫主動器(Proactor),進行無限的事件回圈,監聽完成事件佇列(Completion Event Queue)中的事件,等待完成事件到來
- 異步操作處理器(Asynchronous Operation Processor)執行異步操作,完成后將結果放入到完成事件佇列(Completion Event Queue);
- 主動器(Proactor)從完成事件佇列(Completion Event Queue)中取出結果,分發到相應的完成事件(Concrete Completion Handler)回呼函式處理邏輯中
對比
- Reactor是被動的,先將檔案描述符注冊到事件處理上,被動等待select回傳就緒的檔案描述符以后再處理后續的讀寫IO操作,Proactor是主動的,呼叫異步后立刻回傳,由內核負責讀寫IO操作,處理完以后呼叫相應的完成事件回呼函式處理后續邏輯
- Reactor是同步IO,Proactor是異步IO
- Reactor實作相對簡單;Proactor實作復雜
- Reactor處理耗時長的操作會造成事件分發的阻塞,影響到后續事件的處理;Proactor異步接收能夠處理多個耗時長的并發場景
- Reactor模型中用戶定義的操作是在實際操作之前呼叫的(比如:定義了操作要向某個socket寫資料,那么當該socket可以接收資料的時候,你的操作就會被呼叫);Proactor模型中用戶定義的操作是在實際操作之后呼叫的(比如:定義了一個操作要向某個socket寫資料,那么當作業系統把資料寫入socket完成以后,你的操作才會被呼叫),
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/145076.html
標籤:Java
下一篇:Redis事務的實作原理
