高併發編程模型Reactor

本文旨在講述linux平臺下利用epoll構建Reactor模型。所謂高併發就是:用盡可能快的速度、儘可能少的資源,幹盡可能多的活。因此須要條件以下:1.非阻塞IO;2.線程利用最大化。linux

epoll是linux平臺提供的多路io複用技術(還有select/poll),其餘平臺有與其相似的接口。它的設計思想是:用一個阻塞監聽多個io,避免了多個io阻塞多個過程調用。程序員

最簡單的網絡編程模型有:多線程(每一個鏈接建立一個線程),多進程(每一個鏈接建立一個進程),但這樣不少線程/進程只工做一小段時間,其餘時間都是沒事幹的狀態,資源利用率大大下降。數據庫

有了多路io複用epoll就好多了,它幫咱們監測多個io端口,只須要阻塞在epoll_wait。廣大的程序員創建了一個通用模型Reactor,方便了後臺服務程序的開發。編程

《第一個級別》最簡單的是單線程Reactor模式,即用一個epoll,放在一個線程,循環執行操做。負責①「接收新鏈接」、②「已有鏈接的io讀寫」、③「處理定時器任務」、④「處理實際的業務邏輯」,四部分工做。服務器

首先是「接收新鏈接」,就是用Reactor監聽Acceptor;若是有新鏈接到來,就將新鏈接的讀寫操做監聽到Reactor;定時器任務不用啓動新線程sleep,一個比較好的方案是將timerfd也放到Reactor監聽;最後是處理實際的業務邏輯,不知道是誰創造的這個完美方案:若是有事件須要處理,就給Reactor發一個寫操做(寫8字節特殊字符),暫時中斷它的wait,將它從io等待io中激活,去處理用戶任務。這樣一個線程就能夠同時兼顧四項工做,將線程利用率最大化。網絡

GitHub代碼地址:......多線程

《第二個級別》若是鏈接數很是大或者業務邏輯耗時較長,能夠將①②放在一個線程,③④放在線程池操做,中間經過任務隊列協調。若是還不能支撐,就將①放在一個線程,②放在一個線程,或者開多個線程用於接收鏈接和處理網絡io,用於針對所謂的的高併發請求。併發

《第三個級別》若是一臺電腦開線程到CPU的最合適數量,還不可以應付併發數量,就涉及到服務器集羣了,多臺服務器協同配合應對高併發。例若有:專門處理鏈接的服務器、處理網絡io的服務器、處理業務邏輯的服務器、數據庫服務器。怎麼分配這些服務器的工做,怎麼協調,怎麼保證可靠性,就是專門的議題了。高併發

相關文章
相關標籤/搜索