大家好,我是大明哥。
上篇文章我們分析了高性能 IO模型Reactor模式,了解了什麼是Reactor 模式以及它的三種常見的模式,這篇文章,大明再介紹另外一種高性能IO模型: Proactor。

上篇文章 【死磕 NIO】— Reactor 模式就一定意味着高性能嗎?大明哥分析了 Reactor模式,我們知道Reactor性能确實非常高,适合高并發場景,但是它依然存在一個問題,那就是它是 同步IO。同步IO會有一個什麼問題呢?同步IO需要線程自己等待核心準備好資料,在核心準備資料的過程中,目前線程是阻塞的,這樣就會導緻如果某個線程因為讀取IO的時間過長(比如讀取檔案、寫檔案),則它勢必會影響其他線程的執行。如果對 同步IO、 異步IO 不了解的同學,可以看如下兩篇文章:
【死磕NIO】— 阻塞、非阻塞、同步、異步,傻傻分不清楚
【死磕NIO】— 阻塞IO,非阻塞IO,IO複用,信号驅動IO,異步IO,這你真的分的清楚嗎?
既然 同步IO有缺陷,那我們是不是可以調整為 異步IO呢?完全可以,這就是 Proactor 模式。
Proactor 模式整體與Reactor 模式一緻,差別就在于Proactor模式将所有I/O操作都交給主線程和核心來處理,工作線程僅僅負責業務邏輯。模型如下:
Procator Initiator:負責建立Handler和Procator,并将Procator和Handler都通過Asynchronous operation processor注冊到核心。
Handler:執行業務流程的業務處理器。
Asynchronous operation processor:負責處理注冊請求,并完成IO操作。完成IO操作後會通知Procator。
Procator:根據不同的事件類型回調不同的handler進行業務處理。
這裡需要注意的是: Proactor關注的不是就緒事件,而是完成事件,這是區分Reactor模式的關鍵點。
然而可惜的是,Linux下的異步 I/O 是不完善的,<code>aio</code> 系列函數是由 <code>POSIX</code> 定義的異步操作接口,不是真正的作業系統級别支援的,而是在使用者空間模拟出來的異步,并且僅僅支援基于本地檔案的 <code>aio</code> 異步操作,網絡程式設計中的 <code>socket</code>是不支援的,這也使得基于 Linux 的高性能網絡程式都是使用 Reactor 方案。
而 Windows 裡實作了一套完整的支援 <code>socket</code> 的異步程式設計接口,這套接口就是 <code>IOCP</code>,是由作業系統級别實作的異步 I/O,真正意義上異步 I/O,是以在 Windows 裡實作高性能網絡程式可以使用效率更高的 Proactor 方案。
優缺點
優點
性能确實是強大,效率也高
缺點
複雜。性能好,效率高,東西是好東西,但是使用起來就是複雜。
作業系統支援。上面提到過,Linux系統對異步IO支援不是很好,不是很完善
Proactor模式與Reactor模式 的差別有如下幾點:
Reactor 模式注冊的是檔案描述符的就緒事件。當Reactor 模式有事件發生時,它需要判斷目前事件是讀事件還是寫事件,然後在調用系統的<code>read</code>或者<code>write</code>将資料從核心中拷貝到使用者資料區,然後進行業務處理。
Proactor模式注冊的則是完成事件。即發起異步操作後,作業系統将在核心态完成I/O并拷貝資料到使用者提供的緩沖區中,完成後通知Proactor進行回調,使用者隻需要處理後續的業務即可。
Reactor模式實作<code>同步I/O多路分發</code>
Proactor模式實作<code>異步I/O分發</code>。
在 Linux 作業系統下實作高并發網絡程式設計依然以Reactor 模式為主。
https://zhuanlan.zhihu.com/p/95662364
PS:如果你覺得文章對你有所幫助,别忘了推薦或者分享,因為有你的支援,才是我續寫下篇的動力和源泉!
作者:chenssy。一個專注于【死磕 Java】系列創作的男人
出處:https://www.cnblogs.com/chenssy/p/15526729.html
作者個人網站:https://www.cmsblogs.com/。專注于 Java 優質系列文章分享,提供一站式 Java 學習資料
目前死磕系列包括:
1. 【死磕 Java 并發】:https://www.cmsblogs.com/category/1391296887813967872(已完成)
2.【死磕 Spring 之 IOC】:https://www.cmsblogs.com/category/1391374860344758272(已完成)
3.【死磕 Redis】:https://www.cmsblogs.com/category/1391389927996002304(已完成)
4.【死磕 Java 基礎】:https://www.cmsblogs.com/category/1411518540095295488
5.【死磕 NIO】:https://www.cmsblogs.com/article/1435620402348036096
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。