日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux服务器 | 事件处理模式:Reactor模式、Proactor模式

發(fā)布時(shí)間:2023/12/13 linux 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux服务器 | 事件处理模式:Reactor模式、Proactor模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • Reactor模式
  • Proactor模式
    • 同步I/O模型模擬Proactor模式
  • 兩者的優(yōu)缺點(diǎn)
    • Reactor
    • Proactor


同步I/O模型通常用于實(shí)現(xiàn) Reactor 模式,異步I/O模型通常用于實(shí)現(xiàn) Proactor 模式。(不是絕對的,同步I/O也可模擬出 Proactor 模式)

Reactor模式

原理

Reactor 模式要求主線程(I/O處理單元)只負(fù)責(zé)監(jiān)聽文件描述符上是否有事件就緒,如果有則將該就緒事件通知給工作線程(邏輯單元)。除此之外主線程不會進(jìn)行其他實(shí)質(zhì)性的工作,讀寫數(shù)據(jù)、接收新連接、業(yè)務(wù)邏輯處理全部在工作線程中完成。

工作流程

這里以 epoll_wait 為例,使用同步I/O模型實(shí)現(xiàn)的 Reactor 模式的工作流程如下:

  • 主線程往 epoll 內(nèi)核事件表中注冊 socket 上的讀就緒事件。
  • 主線程調(diào)用 epoll_wait 開始對 socket 的讀事件進(jìn)行監(jiān)控。
  • 如果 socket 讀就緒,epoll_wait 會通知主線程,主線程則將 socket 可讀事件(即 socket 連接本身) 放入請求隊(duì)列中。
  • 請求隊(duì)列上某個(gè)休眠的工作線程被喚醒,此時(shí)會從 socket 中讀取數(shù)據(jù),并且處理用戶請求,然后往 epoll 內(nèi)核事件表中注冊該 socket 的寫就緒事件。
  • 主線程繼續(xù)調(diào)用 epoll_wait 對 socket 的寫事件進(jìn)行監(jiān)控。
  • 當(dāng) socket 寫就緒時(shí),epoll_wait 會通知主線程,主線程則將 socket 可寫事件(即 socket 連接本身) 放入請求隊(duì)列中。
  • 請求隊(duì)列上某個(gè)休眠的工作線程被喚醒,將服務(wù)器處理客戶請求的結(jié)果寫入到 socket 中

  • 工作線程從請求隊(duì)列中取出事件后,根據(jù)事件類型來決定如何處理事件,所以不會區(qū)分 讀工作線程 和 寫工作線程。


    Proactor模式

    原理

    Proactor模式則是將所有的I/O操作全部交給主線程內(nèi)核處理工作線程僅僅負(fù)責(zé)業(yè)務(wù)邏輯。

    工作流程

    這里以 aio 為例,使用異步I/O模型實(shí)現(xiàn)的 Reactor 模式的工作流程如下:

  • 主線程調(diào)用 aio_read 向內(nèi)核注冊 socket 上的讀完成事件,并且告訴內(nèi)核用戶讀緩沖區(qū)的位置,以及讀操作完成時(shí)如何通知應(yīng)用程序(這里以信號為例)。
  • I/O事件交給內(nèi)核進(jìn)行異步處理,此時(shí)主線程繼續(xù)處理其他邏輯(區(qū)別于 Reactor 中主線程需要持續(xù)監(jiān)控就緒事件)。
  • 當(dāng) socket 上的數(shù)據(jù)已被讀入用戶緩沖區(qū)后,內(nèi)核向應(yīng)用程序發(fā)送一個(gè)信號,通知其數(shù)據(jù)已可用。
  • 通過應(yīng)用程序預(yù)先定義好的信號處理函數(shù)來選擇一個(gè)工作線程以處理客戶請求。
  • 工作線程處理完客戶請求之后會調(diào)用 aio_write 向內(nèi)核注冊 socket 上的寫就緒事件,并且告訴內(nèi)核用戶寫緩沖區(qū)的位置,以及寫操作完成時(shí)如何通知應(yīng)用程序(仍選擇使用信號)。
  • 主線程繼續(xù)處理其他邏輯(同2)。
  • 當(dāng)用戶緩沖區(qū)的數(shù)據(jù)被寫入 socket 后,內(nèi)核向應(yīng)用程序發(fā)送一個(gè)信號,通知其數(shù)據(jù)發(fā)送完成。
  • 通過應(yīng)用程序 注冊(預(yù)先定義好) 的信號處理 事件(函數(shù)) 來選擇一個(gè)工作線程來進(jìn)行善后處理,例如是否關(guān)閉 socket。
  • 由于讀/寫事件是通過 aio_read/aio_write 向內(nèi)核中進(jìn)行 注冊 的,并由內(nèi)核通過 信號 向應(yīng)用程序 報(bào)告 的。因此,不同于 Reactor 模式,Proactor 的 epoll_wait 僅僅用來監(jiān)聽 socket 上是否有新的連接請求到來,而不用于 注冊 or 報(bào)告 讀/寫事件。


    同步I/O模型模擬Proactor模式

    原理

    主線程執(zhí)行數(shù)據(jù)讀寫操作,完成后向工作線程通知事件的完成。從工作線程的角度來看,他們就直接獲得了數(shù)據(jù)讀寫的結(jié)果,接下來的工作就只需要對讀寫結(jié)果進(jìn)行業(yè)務(wù)邏輯處理。

    工作流程

    這里以 epoll_wait 為例,使用同步I/O模型實(shí)現(xiàn)的 Proactor 模式的工作流程:

  • 主線程往 epoll 內(nèi)核事件表中注冊 socket 上的讀就緒事件。(同步I/O注冊就緒事件、異步I/O注冊完成事件)
  • 主線程調(diào)用 epoll_wait 等待 socket 上有數(shù)據(jù)可讀。
  • 當(dāng) socket 上有數(shù)據(jù)可讀,epoll_wait 通知主線程,主線程從 socket 中循環(huán)讀取數(shù)據(jù),直到?jīng)]有數(shù)據(jù)可讀。然后將讀到的數(shù)據(jù)封裝成一個(gè)請求對象插入請求隊(duì)列中。
  • 請求隊(duì)列上某個(gè)休眠的工作線程被喚醒,此時(shí)它會獲取請求對象并且處理客戶請求,然后往 epoll 內(nèi)核事件表中注冊 socket 的寫就緒事件。
  • 主線程調(diào)用 epoll_wait 等待 socket 可寫。
  • 如果 socket 寫就緒,epoll_wait 通知主線程,主線程往 socket 中寫入服務(wù)器處理客戶請求的結(jié)果。

  • 兩者的優(yōu)缺點(diǎn)

    Reactor

    Reactor 實(shí)現(xiàn)了一個(gè)被動的事件分離和分發(fā)模型:

    • 主線程只負(fù)責(zé)監(jiān)聽讀寫事件是否就緒,就緒后放入請求隊(duì)列,并喚醒請求隊(duì)列上某個(gè)工作線程;
    • 工作線程讀寫數(shù)據(jù)處理客戶請求

    優(yōu)點(diǎn):

    • 實(shí)現(xiàn)相對簡單,對于耗時(shí)短的處理場景處理高效。
    • 操作系統(tǒng)可以在多個(gè)事件源上等待,并且避免了多線程編程相關(guān)的性能開銷和編程復(fù)雜性。
    • 事件的串行化對應(yīng)用是透明的,可以順序的同步執(zhí)行而不需要加鎖。
    • 將與應(yīng)用無關(guān)的多路分解、分配機(jī)制和與應(yīng)用相關(guān)的回調(diào)函數(shù)分離開來。

    缺點(diǎn):

    • 處理耗時(shí)長的操作會造成事件分發(fā)的阻塞,影響到后續(xù)事件的處理。

    適用場景:

    同時(shí)接收多個(gè)服務(wù)請求,并且依次同步處理它們的事件驅(qū)動程序。


    Proactor

    Proactor 實(shí)現(xiàn)了一個(gè)主動的事件分離和分發(fā)模型:

    • 主線程監(jiān)聽事件是否就緒;
    • 內(nèi)核執(zhí)行I/O操作讀寫數(shù)據(jù);
    • 上一步完成后根據(jù)預(yù)先注冊好的信號函數(shù)選擇一個(gè)工作線程處理客戶請求。

    優(yōu)點(diǎn):

    • 性能更高,能夠適應(yīng)耗時(shí)長的并發(fā)場景(各個(gè)任務(wù)間互不影響);
    • 這種設(shè)計(jì)允許多個(gè)任務(wù)并發(fā)的執(zhí)行,從而提高吞吐量。

    缺點(diǎn):

    • 實(shí)現(xiàn)邏輯復(fù)雜,依賴操作系統(tǒng)對異步的支持,目前實(shí)現(xiàn)了純異步操作的操作系統(tǒng)少。
    • 實(shí)現(xiàn)優(yōu)秀的如 windows IOCP,但由于 windows 系統(tǒng)用于服務(wù)器的局限性,目前應(yīng)用范圍較小。
    • 而 Unix/Linux 系統(tǒng)對純異步的支持有限,應(yīng)用事件驅(qū)動的主流方案還是通過 select/epoll 來實(shí)現(xiàn)。

    適用場景:

    異步接收同時(shí)處理多個(gè)服務(wù)請求的事件驅(qū)動程序。

    總結(jié)

    以上是生活随笔為你收集整理的Linux服务器 | 事件处理模式:Reactor模式、Proactor模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。