国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Reactor和Proactor兩種高效的事件處理模式

這篇具有很好參考價值的文章主要介紹了Reactor和Proactor兩種高效的事件處理模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

????
????服務器程序通常需要處理三類事件:I/O 事件、信號及定時事件。有兩種高效的事件處理模式: Reactor 和 Proactor ,同步 I/O 模型通常用于實現(xiàn) Reactor 模式,異步 I/O 模型通常用于實現(xiàn) Proactor 模式。

Reactor和Proactor兩種高效的事件處理模式,linux,數(shù)據(jù)結構,算法,服務器

Reactor模式

????????要求主線程(I/O 處理單元)只負責監(jiān)聽文件描述符上是否有事件發(fā)生,有的話就立即將該事件通知工作 線程(邏輯單元),將 socket 可讀可寫事件放入請求隊列,交給工作線程處理。除此之外,主線程不做 任何其他實質(zhì)性的工作。讀寫數(shù)據(jù),接受新的連接,以及處理客戶請求均在工作線程中完成。
????????使用同步 I/O (以 epoll_wait 為例)實現(xiàn)的 Reactor 模式的工作流程是:
1. 主線程往 epoll 內(nèi)核事件表中注冊 socket 上的讀就緒事件。
2. 主線程調(diào)用 epoll_wait 等待 socket 上有數(shù)據(jù)可讀。
3. socket 上有數(shù)據(jù)可讀時, epoll_wait 通知主線程。主線程則將 socket 可讀事件放入請求隊列。
4. 睡眠在請求隊列上的某個工作線程被喚醒,它從 socket 讀取數(shù)據(jù),并處理客戶請求,然后往 epoll
內(nèi)核事件表中注冊該 socket 上的寫就緒事件。
5. 當主線程調(diào)用 epoll_wait 等待 socket 可寫。
6. socket 可寫時, epoll_wait 通知主線程。主線程將 socket 可寫事件放入請求隊列。
7. 睡眠在請求隊列上的某個工作線程被喚醒,它往 socket 上寫入服務器處理客戶請求的結果。

?

Reactor和Proactor兩種高效的事件處理模式,linux,數(shù)據(jù)結構,算法,服務器

Reactor 模式主要由 Reactor 和處理資源池這兩個核心部分組成,它倆負責的事情如下:

  • Reactor 負責監(jiān)聽和分發(fā)事件,事件類型包含連接事件、讀寫事件;
  • 處理資源池負責處理事件,如 read -> 業(yè)務邏輯 -> send;
  • 「多 Reactor 單進程 / 線程」實現(xiàn)方案相比「單 Reactor 單進程 / 線程」方案,不僅復雜而且也沒有性能優(yōu)勢,因此實際中并沒有應用。

    剩下的 3 個方案都是比較經(jīng)典的,且都有應用在實際的項目中:

    單 Reactor 單進程 / 線程;
    單 Reactor 多線程 / 進程;
    多 Reactor 多進程 / 線程;

1.??單 Reactor 單進程 / 線程

Reactor和Proactor兩種高效的事件處理模式,linux,數(shù)據(jù)結構,算法,服務器

可以看到進程里有?Reactor、Acceptor、Handler?這三個對象:

  • Reactor 對象的作用是監(jiān)聽和分發(fā)事件;
  • Acceptor 對象的作用是獲取連接;
  • Handler 對象的作用是處理業(yè)務

但是,這種方案存在 2 個缺點:

第一個缺點,因為只有一個進程,無法充分利用 多核 CPU 的性能;
第二個缺點,Handler 對象在業(yè)務處理時,整個進程是無法處理其他連接的事件的,如果業(yè)務處理耗時比較長,那么就造成響應的延遲;
所以,單 Reactor 單進程的方案不適用計算機密集型的場景,只適用于業(yè)務處理非??焖俚膱鼍?。
?

?2.單 Reactor 多線程 / 多進程

如果要克服「單 Reactor 單線程 / 進程」方案的缺點,那么就需要引入多線程 / 多進程,這樣就產(chǎn)生了單 Reactor 多線程 / 多進程的方案。

Reactor和Proactor兩種高效的事件處理模式,linux,數(shù)據(jù)結構,算法,服務器

????????Reactor 對象通過 select (IO 多路復用接口) 監(jiān)聽事件,收到事件后通過 dispatch 進行分發(fā),具體分發(fā)給 Acceptor 對象還是 Handler 對象,還要看收到的事件類型;
????????如果是連接建立的事件,則交由 Acceptor 對象進行處理,Acceptor 對象會通過 accept 方法 獲取連接,并創(chuàng)建一個 Handler 對象來處理后續(xù)的響應事件;
????????如果不是連接建立事件, 則交由當前連接對應的 Handler 對象來進行響應;
上面的三個步驟和單 Reactor 單線程方案是一樣的,接下來的步驟就開始不一樣了:

????????Handler 對象不再負責業(yè)務處理,只負責數(shù)據(jù)的接收和發(fā)送,Handler 對象通過 read 讀取到數(shù)據(jù)后,會將數(shù)據(jù)發(fā)給子線程里的 Processor 對象進行業(yè)務處理;
????????子線程里的 Processor 對象就進行業(yè)務處理,處理完后,將結果發(fā)給主線程中的 Handler 對象,接著由 Handler 通過 send 方法將響應結果發(fā)送給 client;

????????引入多線程確實可以充分利用多核 CPU 的性能,但也帶來了共享資源的競爭和同步的問題。使用互斥鎖是一種常見的手段,但需要小心避免死鎖和性能問題。

????????關于單 Reactor 多進程方案,你提到了一些問題,確實存在挑戰(zhàn)。進程間通信的復雜性和父進程需要了解子進程要發(fā)送數(shù)據(jù)給哪個客戶端的問題增加了實現(xiàn)的復雜度。相對而言,多線程之間可以共享數(shù)據(jù),雖然需要考慮并發(fā)問題,但處理起來相對簡單。

「單 Reactor」的模式在面對瞬間高并發(fā)的場景時可能成為性能瓶頸。這是因為單個 Reactor 在主線程中運行,如果事件處理耗時較長,可能導致其他事件的等待,降低系統(tǒng)的響應性能。這是一個需要權衡的問題,可以通過使用多個 Reactor 實例或者其他更復雜的事件處理模型來解決。

3.? 多 Reactor 多進程 / 線程

Reactor和Proactor兩種高效的事件處理模式,linux,數(shù)據(jù)結構,算法,服務器

? ? ? ? 1 .主線程中的 MainReactor 對象通過 select 監(jiān)控連接建立事件,收到事件后通過 Acceptor 對象中的 accept 獲取連接,將新的連接分配給某個子線程;
? ? ? ? 2. 子線程中的 SubReactor 對象將 MainReactor 對象分配的連接加入 select 繼續(xù)進行監(jiān)聽,并創(chuàng)建一個 Handler 用于處理連接的響應事件。
? ? ? ? 3.如果有新的事件發(fā)生時,SubReactor 對象會調(diào)用當前連接對應的 Handler 對象來進行響應。Handler 對象通過 read -> 業(yè)務處理 -> send 的流程來完成完整的業(yè)務流程。?

多 Reactor 多線程的方案雖然看起來復雜的,但是實際實現(xiàn)時比單 Reactor 多線程的方案要簡單的多,原因如下:

????????主線程和子線程分工明確,主線程只負責接收新連接,子線程負責完成后續(xù)的業(yè)務處理。
????????主線程和子線程的交互很簡單,主線程只需要把新連接傳給子線程,子線程無須返回數(shù)據(jù),直接就可以在子線程將處理結果發(fā)送給客戶端。

    • Nginx 是一個高性能的 HTTP 和反向代理服務器。它采用了多 Reactor 多進程的方案,其中主進程負責初始化 socket,而具體的連接處理則由子進程的 Reactor 負責。這種模型有效地避免了驚群現(xiàn)象,并且每個子進程都有自己的 Reactor 處理連接,提高了并發(fā)性。

????????對于 Nginx 中提到的差異,即主進程只負責初始化 socket,具體的連接處理由子進程的 Reactor 完成,這是一種典型的 Nginx 的優(yōu)化策略,避免了主進程直接參與連接的處理,降低了主進程的壓力。這樣的設計有效地避免了驚群現(xiàn)象,提高了整體性能。這種模型也被稱為 "master-worker" 模型。

Proactor模式

????????Proactor 模式將所有 I/O 操作都交給主線程和內(nèi)核來處理(進行讀、寫),工作線程僅僅負責業(yè)務邏輯。使用異步 I/O 模型(以 aio_read aio_write 為例)實現(xiàn)的 Proactor 模式的工作流程是:
????????1. 主線程調(diào)用 aio_read 函數(shù)向內(nèi)核注冊 socket 上的讀完成事件,并告訴內(nèi)核用戶讀緩沖區(qū)的位置,以及讀操作完成時如何通知應用程序(這里以信號為例)。
????????2. 主線程繼續(xù)處理其他邏輯。
????????3. 當 socket 上的數(shù)據(jù)被讀入用戶緩沖區(qū)后,內(nèi)核將向應用程序發(fā)送一個信號,以通知應用程序數(shù)據(jù)已經(jīng)可用。
????????4. 應用程序預先定義好的信號處理函數(shù)選擇一個工作線程來處理客戶請求。工作線程處理完客戶請求后,調(diào)用 aio_write 函數(shù)向內(nèi)核注冊 socket 上的寫完成事件,并告訴內(nèi)核用戶寫緩沖區(qū)的位置,以 及寫操作完成時如何通知應用程序。
????????5. 主線程繼續(xù)處理其他邏輯。
????????6. 當用戶緩沖區(qū)的數(shù)據(jù)被寫入 socket 之后,內(nèi)核將向應用程序發(fā)送一個信號,以通知應用程序數(shù)據(jù) 已經(jīng)發(fā)送完畢。
????????7. 應用程序預先定義好的信號處理函數(shù)選擇一個工作線程來做善后處理,比如決定是否關閉 socket。

Reactor和Proactor兩種高效的事件處理模式,linux,數(shù)據(jù)結構,算法,服務器

Reactor和Proactor兩種高效的事件處理模式,linux,數(shù)據(jù)結構,算法,服務器

?????????可惜的是,在 Linux 下的異步 I/O 是不完善的, aio 系列函數(shù)是由 POSIX 定義的異步操作接口,不是真正的操作系統(tǒng)級別支持的,而是在用戶空間模擬出來的異步,并且僅僅支持基于本地文件的 aio 異步操作,網(wǎng)絡編程中的 socket 是不支持的,這也使得基于 Linux 的高性能網(wǎng)絡程序都是使用 Reactor 方案。

區(qū)別:

????????Reactor 是非阻塞同步網(wǎng)絡模式,感知的是就緒可讀寫事件。在每次感知到有事件發(fā)生(比如可讀就緒事件)后,就需要應用進程主動調(diào)用 read 方法來完成數(shù)據(jù)的讀取,也就是要應用進程主動將 socket 接收緩存中的數(shù)據(jù)讀到應用進程內(nèi)存中,這個過程是同步的,讀取完數(shù)據(jù)后應用進程才能處理數(shù)據(jù)。
????????Proactor 是異步網(wǎng)絡模式, 感知的是已完成的讀寫事件。在發(fā)起異步讀寫請求時,需要傳入數(shù)據(jù)緩沖區(qū)的地址(用來存放結果數(shù)據(jù))等信息,這樣系統(tǒng)內(nèi)核才可以自動幫我們把數(shù)據(jù)的讀寫工作完成,這里的讀寫工作全程由操作系統(tǒng)來做,并不需要像 Reactor 那樣還需要應用進程主動發(fā)起 read/write 來讀寫數(shù)據(jù),操作系統(tǒng)完成讀寫工作后,就會通知應用進程直接處理數(shù)據(jù)。
因此,Reactor 可以理解為「來了事件操作系統(tǒng)通知應用進程,讓應用進程來處理」,而 Proactor 可以理解為「來了事件操作系統(tǒng)來處理,處理完再通知應用進程」。這里的「事件」就是有新連接、有數(shù)據(jù)可讀、有數(shù)據(jù)可寫的這些 I/O 事件這里的「處理」包含從驅(qū)動讀取到內(nèi)核以及從內(nèi)核讀取到用戶空間。

模擬proactor?

????????使用同步 I/O 方式模擬出 Proactor 模式。原理是:主線程執(zhí)行數(shù)據(jù)讀寫操作,讀寫完成之后,主線程向 工作線程通知這一” 完成事件 。那么從工作線程的角度來看,它們就直接獲得了數(shù)據(jù)讀寫的結果,接下來要做的只是對讀寫的結果進行邏輯處理。
????????使用同步 I/O 模型(以 epoll_wait 為例)模擬出的 Proactor 模式的工作流程如下:
????????1. 主線程往 epoll 內(nèi)核事件表中注冊 socket 上的讀就緒事件。
????????2. 主線程調(diào)用 epoll_wait 等待 socket 上有數(shù)據(jù)可讀。
????????3. 當 socket 上有數(shù)據(jù)可讀時, epoll_wait 通知主線程。主線程從 socket 循環(huán)讀取數(shù)據(jù),直到?jīng)]有更多數(shù)據(jù)可讀,然后將讀取到的數(shù)據(jù)封裝成一個請求對象并插入請求隊列。
????????4. 睡眠在請求隊列上的某個工作線程被喚醒,它獲得請求對象并處理客戶請求,然后往 epoll 內(nèi)核事件表中注冊 socket 上的寫就緒事件。
????????5. 主線程調(diào)用 epoll_wait 等待 socket 可寫。
????????6. 當 socket 可寫時, epoll_wait 通知主線程。主線程往 socket 上寫入服務器處理客戶請求的結果。

Reactor和Proactor兩種高效的事件處理模式,linux,數(shù)據(jù)結構,算法,服務器文章來源地址http://www.zghlxwxcb.cn/news/detail-802487.html

到了這里,關于Reactor和Proactor兩種高效的事件處理模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 二維碼智慧門牌管理系統(tǒng)升級,打造高效事件處理流程

    二維碼智慧門牌管理系統(tǒng)升級,打造高效事件處理流程

    隨著城市化的不斷推進,城市管理面臨越來越多的挑戰(zhàn)。為了更好地解決這些問題,許多城市已經(jīng)開始采用二維碼智慧門牌管理系統(tǒng)。這個系統(tǒng)不僅可以提高城市管理的效率,還可以讓市民更加方便快捷地了解城市的相關信息。然而,隨著城市管理需求的不斷增加,這個系統(tǒng)

    2024年02月07日
    瀏覽(19)
  • 基于深度學習的視頻結構化:從信息提取到更高效的數(shù)據(jù)處理

    作者:禪與計算機程序設計藝術 1.1. 背景介紹 近年來,隨著深度學習技術的發(fā)展,計算機視覺領域也取得了顯著的進步。特別是,基于深度學習的圖像處理算法在圖像識別、語音識別等方面取得了突破性的進展。同時,視頻結構化作為視頻內(nèi)容分發(fā)、存儲和推薦的重要環(huán)節(jié),

    2024年02月12日
    瀏覽(29)
  • Redis源碼篇 - Reactor設計模式 和 Redis Reactor設計模式

    Redis源碼篇 - Reactor設計模式 和 Redis Reactor設計模式

    Reactor :反應器模式或者應答者模式,它是一種基于事件驅(qū)動的設計模式。擁有一個或者多個輸入源,通過反應器分發(fā)給多個worker線程處理,實現(xiàn)并發(fā)場景下事件處理。 ? ? ? ?此圖網(wǎng)上找的,畫的很好:

    2024年02月16日
    瀏覽(14)
  • 高效協(xié)作處理緩存清理需求:生產(chǎn)者-消費者模式助力多模塊緩存管理

    高效協(xié)作處理緩存清理需求:生產(chǎn)者-消費者模式助力多模塊緩存管理

    在現(xiàn)代應用系統(tǒng)中,緩存是提高性能和減少數(shù)據(jù)庫負載的重要手段之一。然而,緩存的數(shù)據(jù)在某些情況下可能會過期或者變得無效,因此需要及時進行清理。在復雜的應用系統(tǒng)中,可能有多個系統(tǒng)、多個模塊產(chǎn)生緩存清理需求,而這些系統(tǒng)、模塊之間的清理任務需要高效的協(xié)

    2024年02月15日
    瀏覽(31)
  • Netty Reactor 模式解析

    Netty Reactor 模式解析

    目錄 Reactor 模式? ? ? ?? 具體流程 配置? 初始化 NioEventLoop? ServerBootstrapAcceptor 分發(fā) 在剛學 Netty 的時候,我們肯定都很熟悉下面這張圖,它就是單Reactor多線程模型。 在寫Netty 服務端代碼的時候,下面的代碼時必不可少的,這是為什么呢? ? ? ? ? 在 Netty 里,EventLoopGroup

    2024年01月25日
    瀏覽(17)
  • Netty和Reactor設計模式

    Netty和Reactor設計模式

    Netty一個線程通過多路復用,能夠?qū)崿F(xiàn)多個socket的非阻塞的調(diào)用。 Reactor 模式是一種設計模式,也叫響應器模式。 以下是 Reactor 模式的基本組成部分: 事件處理器(Event Handlers): 這些是實際處理特定類型事件的組件。它們通過注冊到 Reactor 中來接收事件通知。 事件分發(fā)器(

    2024年01月21日
    瀏覽(10)
  • 服務器IO復用reactor模式

    調(diào)試: Linux下nc命令作為客戶端: nc 127.0.0.1 7777

    2024年02月10日
    瀏覽(17)
  • Vue (v-bind指令、el與data的兩種寫法、理解MVVM、數(shù)據(jù)代理、V-no事件處理、雙向數(shù)據(jù)綁定V-model、登陸頁面實現(xiàn)

    Vue (v-bind指令、el與data的兩種寫法、理解MVVM、數(shù)據(jù)代理、V-no事件處理、雙向數(shù)據(jù)綁定V-model、登陸頁面實現(xiàn)

    V-no用于監(jiān)聽DOM對象 v-model 指令用來在 input、select、textarea、checkbox、radio 等表單控件元素上創(chuàng)建雙向數(shù)據(jù)綁定,根據(jù)表單上的值,自動更新綁定的元素的值。 按鈕的事件我們可以使用 v-on 監(jiān)聽事件,并對用戶的輸入進行響應。 下拉選項實例:

    2024年01月23日
    瀏覽(23)
  • 了解ET模式和LT模式:Linux網(wǎng)絡編程中的事件觸發(fā)方式

    當談到Linux網(wǎng)絡編程中的ET(邊緣觸發(fā))模式和LT(水平觸發(fā))模式時,我們需要理解它們在事件驅(qū)動編程中的作用和區(qū)別。下面是一篇詳細解釋這兩種模式的博文,包含代碼示例。 摘要: 在Linux網(wǎng)絡編程中,ET(邊緣觸發(fā))模式和LT(水平觸發(fā))模式是兩種常用的事件觸發(fā)方式

    2024年02月11日
    瀏覽(14)
  • 【軟件工具】 Linux 中的 ARM 和 AMD 兩種不同的處理器架構簡介

    Linux 中的 ARM 和 AMD 兩種不同的處理器架構。ARM 和 AMD 架構的主要區(qū)別在于它們的設計哲學、性能特性、能效和主要應用場景。以下是一些關鍵差異: 架構設計 : ARM(Advanced RISC Machine) :ARM 架構基于 RISC(精簡指令集計算)原理。它使用更少的指令和簡化的指令集,這有助

    2024年04月10日
    瀏覽(89)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包