IO 中 Reactor和Proactor 設計模式

weixin_34146805發表於2017-11-29

1.Reactor模式和Proactor模式

其實阻塞與非阻塞都可以理解為同步範疇下才有的概念,對於非同步,就不會再去分阻塞非阻塞。對於使用者程式,接到非同步通知後,就直接操作程式使用者態空間裡的資料好了。

1.首先來看看Reactor模式,Reactor模式應用於同步I/O的場景。我們分別以讀操作和寫操作為例來看看Reactor中的具體步驟:

讀取操作:

1.應用程式註冊讀就緒事件和相關聯的事件處理器
2.事件分離器等待事件的發生
3.當發生讀就緒事件的時候,事件分離器呼叫第一步註冊的事件處理器
4.事件處理器首先執行實際的讀取操作,然後根據讀取到的內容進行進一步的處理

寫入操作類似於讀取操作,只不過第一步註冊的是寫就緒事件。

2.下面我們來看看Proactor模式中讀取操作和寫入操作的過程:

讀取操作:

1.應用程式初始化一個非同步讀取操作,然後註冊相應的事件處理器,此時事件處理器不關注讀取就緒事件,而是關注讀取完成事件,這是區別於Reactor的關鍵。
2.事件分離器等待讀取操作完成事件
3.在事件分離器等待讀取操作完成的時候,作業系統呼叫核心執行緒完成讀取操作(非同步IO都是作業系統負責將資料讀寫到應用傳遞進來的緩衝區供應用程式操作,作業系統扮演了重要角色),並將讀取的內容放入使用者傳遞過來的快取區中。這也是區別於Reactor的一點,Proactor中,應用程式需要傳遞快取區。
4.事件分離器捕獲到讀取完成事件後,啟用應用程式註冊的事件處理器,事件處理器直接從快取區讀取資料,而不需要進行實際的讀取操作。

Proactor中寫入操作和讀取操作,只不過感興趣的事件是寫入完成事件。

從上面可以看出,Reactor和Proactor模式的主要區別就是真正的讀取和寫入操作是有誰來完成的,Reactor中需要應用程式自己讀取或者寫入資料,而Proactor模式中,應用程式不需要進行實際的讀寫過程,它只需要從快取區讀取或者寫入即可,作業系統會讀取快取區或者寫入快取區到真正的IO裝置.

綜上所述,同步和非同步是相對於應用和核心的互動方式而言的,同步 需要主動去詢問,而非同步的時候核心在IO事件發生的時候通知應用程式,而阻塞和非阻塞僅僅是系統在呼叫系統呼叫的時候函式的實現方式而已。

相關文章