Linux服务器 | 事件处理模式:Reactor模式、Proactor模式
文章目錄
- 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 模式的工作流程如下:
工作線程從請求隊(duì)列中取出事件后,根據(jù)事件類型來決定如何處理事件,所以不會區(qū)分 讀工作線程 和 寫工作線程。
Proactor模式
原理
Proactor模式則是將所有的I/O操作全部交給主線程和內(nèi)核處理,工作線程僅僅負(fù)責(zé)業(yè)務(wù)邏輯。
工作流程
這里以 aio 為例,使用異步I/O模型實(shí)現(xiàn)的 Reactor 模式的工作流程如下:
由于讀/寫事件是通過 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 模式的工作流程:
兩者的優(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于三菱PLC与变频器ASCII通讯的讲
- 下一篇: Linux网络编程 | socket选项