I/O模型系列之四:兩種高性能IO設計模式 Reactor 和 Proactor

  不同的操作系統實現的io策略可能不一樣,即使是同一個操作系統也可能存在多重io策略,常見如linux上的select,poll,epoll,面對這么多不同類型的io接口,這里需要一層抽象api來完成,所以就演變出來兩種高性能的io的設計模式,分別是Reactor(同步IO)和Proactor(異步IO)。

1. Reactor 

在Reactor中,事件分離器負責等待文件描述符或socket為讀寫操作準備就緒,然后將就緒事件傳遞給對應的處理器,最后由處理器負責完成實際的讀寫工作。

Reactor 的標準(典型)的工作方式是:

(1)應用程序注冊讀就緒事件和相關聯的事件處理器

(2)Reactor阻塞等待內核事件通知

(3)Reactor收到通知,然后分發可讀寫事件(讀寫準備就緒)到用戶事件處理函數

(4)用戶讀取數據,并處理數據

(5)事件處理器完成實際的讀操作,處理讀到的數據,注冊新的事件,然后返還控制權。

2. Proactor

Proactor 的標準(典型)的工作方式是:

(1)應用程序初始化一個異步讀取操作,然后注冊相應的事件處理器,此時事件處理器不關注讀取就緒事件,而是關注讀取完成事件,這是區別于Reactor的關鍵。

(2)事件分離器等待讀取操作完成事件

(3)在事件分離器等待讀取操作完成的時候,操作系統調用內核線程完成讀取操作,并將讀取的內容放入用戶傳遞過來的緩存區中。這也是區別于Reactor的一點,Proactor中,應用程序需要傳遞緩存區。

(4)事件分離器捕獲到讀取完成事件后,激活應用程序注冊的事件處理器,事件處理器直接從緩存區讀取數據,而不需要進行實際的讀取操作。

3.?簡單的理解(抄過來的)

并發系統常使用reactor模式,代替常用的多線程的處理方式,節省系統的資源,提高系統的吞吐量。

  以一個餐飲為例,每一個人來就餐就是一個事件,他會先看一下菜單,然后點餐。就像一個網站會有很多的請求,要求服務器做一些事情。處理這些就餐事件的就需要我們的服務人員了。

(1) 在多線程處理的方式會是這樣的:

一個人來就餐,一個服務員去服務,然后客人會看菜單,點菜。 服務員將菜單給后廚。

二個人來就餐,二個服務員去服務……

五個人來就餐,五個服務員去服務…

?  

  (2) 在線程池處理的方式會是這樣的:(固定的10個人去服務,但仍然供不應求)

  (3) Reactor設計模式: 單個線程來做多線程的事

?  顧客通過呼叫服務員(event事件)通知服務員,菜單寫好了,服務員就會把菜單交給廚師(事件處理器),廚師就會去做菜了。

  

  

  (4) Proactor設計模式:?讓別人做完通知自己

    

?    

?

4.?兩者的區別

區別ReactorProactor
定義

被動的等待指示事件的到來,并作出反應

它有一個等待的過程,做什么事都要放入到監聽事件集合中等待handler可用時再操作。

直接調用異步讀寫操作,調用完立即返回,

由內核負責寫操作,寫完后調用相應的回調函數處理后續邏輯。

實現

實現了一個被動的事件分離和分發模型

服務等待請求事件的到來,再通過不間斷地同步處理事件做出反應。

實現了一個主動的事件分離和分發模型。

允許多個任務并發的執行,從而提高吞吐量,可執行耗時長的任務。

主動與被動被動主動
同步與異步同步異步
優點

1.?簡單。實現相對簡單,對于耗時短的處理場景處理高效。

2.?單線程。操作系統可在多個事件源上等待。避免了多線程編程相關的性能開銷和編程復雜性。

3.?不用鎖。事件的串行化對應用時透明的,可以順序的同步執行而不需加鎖。

4.?事務隔離。將與應用無關的? ?多路分解和分配機制?與應用相關的? ?回調函數? 分離開來

性能更高,能夠處理耗時長的并發場景。
缺點

處理耗時長的操作會造成事務分發的阻塞,影響后續事件的處理。

1.?復雜。實現邏輯復雜。

2.?依賴OS對異步的支持(很少很難)

使用場景

同時接受多個服務請求,并且依次同步的處理他們的事件驅動程序。

耗時短的。

步接受和同時處理多個服務請求的事件驅動程序

耗時長的。

五.總結

基于事件驅動的網絡編程的兩種設計模式:

  Reactor (反應堆?同步IO)  java NIO  多路復用IO  redis libevent? Linux epoll

  Proactor(前攝器?異步IO)  java AIO  異步IO模型  目前只有 Windows IO completion port.(iocp)模型

  1. 只有IOCP是asynchronous I/O,其他機制或多或少都會有一點阻塞。
  2. select低效是因為每次它都需要輪詢。但低效也是相對的,視情況而定,也可通過良好的設計改善
  3. epoll, kqueue、select是Reacor模式,IOCP是Proactor模式。
  4. java nio包是select模型。
  5. epoll, kqueue、select?等是IO策略,他們屬于設計模式,他們實現設計模式,相對于設計模式,設計策略更細節,設計模式更抽象。

摘錄網址:

I/O模型之三:兩種高性能 I/O 設計模式 Reactor 和 Proactor

IO設計模式之Reactor和Proactor

reactor和proactor模式

Reactor模式,或者叫反應器模式

轉載于:https://www.cnblogs.com/haimishasha/p/10623247.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394123.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394123.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394123.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python中序列類型和數組之間的區別_「Python」序列構成的數組

一、Python 標準庫的序列類型分為:容器序列:能夠存放不同類型數據的序列(list、tuple、collections.deque)。扁平序列:只能容納一種類型的數據(str、bytes、bytearray 和 array.array)。其中,容器序列存放的是它們所包含的任意類型…

如何使用EF Core在Blazor中創建級聯的DropDownList

介紹 (Introduction) In this article, we are going to create a cascading dropdown list in Blazor using Entity Framework Core database first approach. We will create two dropdown lists — Country and City. Upon selecting the value from the country dropdown, …

gcc/g++命令

參考:http://www.cnblogs.com/cryinstall/archive/2011/09/27/2280824.html 注意:gcc和g是linux系統下的編程常用指令,C語言文件用gcc,cpp文件用g。 1.預處理 g -E filename.cpp > filename.i 功能:輸出預處理后的…

計算機存儲

位(bit):一個數字0或一個數字1,代表一位 字節(Byte):每逢8位是一個字節,是數據存儲的最小單位 1Byte 8 bit 平時所說的網速: 100Mbps實際上是以位(b&#xf…

leetcode113. 路徑總和 II(dfs)

給定一個二叉樹和一個目標和,找到所有從根節點到葉子節點路徑總和等于給定目標和的路徑。說明: 葉子節點是指沒有子節點的節點。示例: 給定如下二叉樹,以及目標和 sum 22,5/ \4 8/ / \11 13 4/ \ / \7 2 5 1 返回:[[5,4,11,…

java forward 修改請求參數_聊聊springboot session timeout參數設置

序本文主要介紹下spring boot中對session timeout參數值的設置過程。ServerPropertiesspring-boot-autoconfigure-1.5.8.RELEASE-sources.jar!/org/springframework/boot/autoconfigure/web/ServerProperties.javaOverridepublic void customize(ConfigurableEmbeddedServletCo…

javascript控制臺_如何使用JavaScript控制臺改善工作流程

javascript控制臺by Riccardo Canella里卡多卡內拉(Riccardo Canella) 如何使用JavaScript控制臺改善工作流程 (How you can improve your workflow using the JavaScript console) As a web developer, you know very well the need to debug your code. We often use extern…

appium===setup/setupclass的區別,以及@classmathod的使用方法

一、裝飾器 1.用setUp與setUpClass區別 setup():每個測試case運行前運行 teardown():每個測試case運行完后執行 setUpClass():必須使用classmethod 裝飾器,所有case運行前只運行一次 tearDownClass():必須使用classmethod裝飾器,所有case運行完后只運行一次 2.是修飾符&#xf…

cache failed module status_Flutter混編之路——iOS踩坑記錄

一、運行Xcode編譯或者flutter run/build 過程中報錯:"x86_64" is not an allowed value for option "ios-arch".解決方案在Debug.xcconfig中指定 “FLUTTER_BUILD_MODEdebug”,Release.xcconfig中指定“FLUTTER_BUILD_MODErelease”…

【最短路徑Floyd算法詳解推導過程】看完這篇,你還能不懂Floyd算法?還不會?...

簡介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的算法,與Dijkstra算法類似。該算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授羅伯特…

java object類的常用子類_Java中Object類常用的12個方法,你用過幾個?

前言Java 中的 Object 方法在面試中是一個非常高頻的點,畢竟 Object 是所有類的“老祖宗”。Java 中所有的類都有一個共同的祖先 Object 類,子類都會繼承所有 Object 類中的 public 方法。先看下 Object 的類結構(快捷鍵:alt7):1.…

leetcode面試題 04.12. 求和路徑(dfs)

給定一棵二叉樹,其中每個節點都含有一個整數數值(該值或正或負)。設計一個算法,打印節點數值總和等于某個給定值的所有路徑的數量。注意,路徑不一定非得從二叉樹的根節點或葉節點開始或結束,但是其方向必須向下(只能從父節點指向子…

javaweb學習總結(二十二)——基于Servlet+JSP+JavaBean開發模式的用戶登錄注冊

一、ServletJSPJavaBean開發模式(MVC)介紹 ServletJSPJavaBean模式(MVC)適合開發復雜的web應用,在這種模式下,servlet負責處理用戶請求,jsp負責數據顯示,javabean負責封裝數據。 ServletJSPJavaBean模式程序各個模塊之間層次清晰&…

2018黃河獎設計大賽獲獎_宣布我們的freeCodeCamp 2018杰出貢獻者獎獲獎者

2018黃河獎設計大賽獲獎by Quincy Larson昆西拉爾森(Quincy Larson) 宣布我們的freeCodeCamp 2018杰出貢獻者獎獲獎者 (Announcing Our freeCodeCamp 2018 Top Contributor Award Winners) Over the past 3 years, freeCodeCamp.org has grown from a small open source proje…

Log4j配置詳解

來自: http://www.blogjava.net/zJun/archive/2006/06/28/55511.html Log4J的配置文件(Configuration File)就是用來設置記錄器的級別、存放器和布局的,它可接keyvalue格式的設置或xml格式的設置信息。通過配置,可以創建出Log4J的運行環境。1. 配置文件 …

cors數據類型_如何根據RTK的差分格式選擇千尋cors賬號的源節點進行設置?

千尋cors賬號的設置中源節點是根據使用的品牌RTK是為雙星儀器還是三星儀器選擇,但問題就在于我們看到的RTK的技術參數中一般很少見到標注儀器的衛星系統,更多的是差分格式。其實千尋cors賬號的源節點也可以根據RTK的差分格式進行選擇,不過這兩…

java swing 串口_ComTest 接收串口數據,并顯示在文本框內,通過JavaSwing實現 Develop 265萬源代碼下載- www.pudn.com...

文件名稱: ComTest下載 收藏√ [5 4 3 2 1 ]開發工具: Java文件大小: 3157 KB上傳時間: 2016-09-21下載次數: 0提 供 者: 韓坤詳細說明:接收串口數據,并顯示在文本框內,通過JavaSwing實現-Receive serial data, and displayed in the t…

leetcode329. 矩陣中的最長遞增路徑(dfs)

給定一個整數矩陣,找出最長遞增路徑的長度。對于每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。示例 1:輸入: nums [[9,9,4],[6,6,8…

SQL大圣之路筆記——PowerDesigner之新建table、view、proc

1. 新建table、view、proc 轉載于:https://www.cnblogs.com/allenzhang/p/6305564.html

用python繪制一條直線_python繪制直線的方法

本文實例為大家分享了python繪制直線的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下#!/usr/bin/env pythonimport vtk# 繪制通用方法def myshow(linepolydata):# Now well look at it.lineMapper vtk.vtkPolyDataMapper()if vtk.VTK_MAJOR_VERSION < 5:lineMap…