您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Reactor模型與Proactor模型的區別是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
它是同步非阻塞模型。也稱為Dispatcher模型。想想如果每一個連接過來我們都得建一個線程來處理這個連接,那連接一多線程不得爆滿,那可能有人說上線程池,對線程池肯定是要上的。但這只能解決線程數的問題,但還有一個問題就是資源利用率的問題,當連接沒斷開的時候,當這個連接暫時沒請求的時候你的線程是不是得阻塞著等著請求呀,那線程等于還是被人占用了,別的連接有請求的時候也用不到這個線程,資源的浪費啊,性能低啊。
那如何解決這個問題呢?
當然是等連接有請求的時候線程再上去處理。那這個事情得找個“人”來做,咱們業務線程就處理業務,就是得有個“人”來管理所有的連接,他發現哪個連接有請求了就分配業務線程來處理。
這就叫Reactor模型。上面說的那個"人"我們稱為reactor,中文翻譯時反應堆的意思,也就是他就是那個監視的人,如果有情況來了他就有所反應,分發任務給業務線程處理。
可以有單Reactor單線程,單Reactor多線程,多Reactor多線程
單Reactor單線程
select會一直監聽著事件,事件來了之后給dispatch分發,如果建立請求的事件則分配的acceptor,由acceptor創建一個handler來處理后續的業務,如果不是建立請求的事件則分配個之前對應的handler來處理后續業務
這個情況的優點就是簡單。。。沒有多線程共享資源爭搶導致的問題。缺點就是就單線程,浪費了多CPU,并且同一時刻只有一個handler能處理,其他的得等著。
聽起來好像沒啥用啊這樣,是的絕大部分場景不適合,但是redis就是這樣用的。因為它處理業務夠快。所以這種適合在業務處理極快的情況下使用。
單Reactor多線程
當業務處理不快就上多線程咯。
這個模式和上面的區別就在于具體業務實現不由handler處理的,handler只負責read數據,將數據給業務線程,然后業務線程處理完畢之后返回結果給handler,由handler send給客戶端。
這個模式的優點就是可以充分利用CPU,適合業務處理不快的情況。缺點就是多線程之間共享資源的爭搶產生的問題,并且只有一個Reactor來監聽并響應,當請求量太大時,一個Reactor可能會成為性能瓶頸。
多Reactor多線程
所以多Reactor多線程就來啦。
mainReactor主要用來接受連接,由連接來就給acceptor,acceptor將新的連接分配個某個subReactor,然后這個subReactor將其加入自己的監聽列表,并創建一個handler來處理這個連接。之后就都由這個subReactor來select監聽來響應這個連接的請求,然后dispatch給對應的handler來read,業務處理,send。mainReactor就不管啦。
所以這種方案就等于主Reactor分流了,只有新的連接由主Reactor接受,老的連接都分給了subReactor來響應。
它是異步非阻塞模型。中文翻譯為前攝器。。不知道啥玩意,可以稱之為主動器。也就是我們不必等待I/O數據準備好也就是內核緩存已經讀數據到用戶空間。這一切都有內核來幫我們搞定,數據準備好了之后就通知Proactor,然后Proactor就調用相應的Handler進行業務處理。相對于Reactor省去了遍歷事件通知隊列selector 的代價。
由initiator創建handler和proactor并通過Asynchronous Operation Processor注冊到內核,然后Asynchronous Operation Processor完成I/O會通知proactor,proactor再調用對應的handler處理業務。
所以理論上Proactor的效率比Reactor高,但是linux并沒有真正的實現Proactor模型,而是epoll模擬出Proactor模型。
以上就是Reactor模型與Proactor模型的區別是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。