UNIX網路程式設計 伺服器高效併發模式

2021-09-13 02:11:43 字數 1054 閱讀 6634

半同步/半非同步模式

在併發模式下,同步和非同步的概念與i/o同步非同步的概念有所不同,這裡的同步是指程式按照**的順序執行,而非同步指的是程式的執行需要系統事件來驅動,比如訊號、中斷等。

非同步執行緒效率高,但編寫相對複雜,難於調式,而同步執行緒剛好相反,邏輯簡單,但效率較差。

半同步/半非同步模式結合了同步執行緒和非同步執行緒的優點,它在處理i/o事件時使用非同步執行緒,處理客戶邏輯則使用同步執行緒。這樣既滿足了客戶連線的實時性,又能同時處理多個連線。

實現半同步/半非同步需要三個模組:非同步處理模組、同步處理模組和佇列模組。

在實際的應用中,一般使用i/o復用epoll在主線程上監聽客戶端的連線,一旦監聽到新的客戶請求後,將其封裝成請求物件,插入到佇列中,同時,很多任務作執行緒可以來讀取並處理該請求物件。

在這個模式中,最可能阻塞的操作放在同步模組中,這樣不會影響到非同步模組的處理,不同模組可以使用不同的同步策略,互不干擾,模組間通訊則使用ipc實現,但這樣則會造成同步模組和非同步模組使用佇列模組傳送資料的時候,由於資料拷貝和上下文切換導致的效能開銷。

半同步/半反應堆模式

半同步/半反應堆模式是半同步/半非同步模式的乙個變體,在半同步/半非同步模式中,工作執行緒如何選擇佇列中的請求,是事先設計好的。而在半同步/半反應堆模式中,工作執行緒通過競爭(例如申請互斥鎖)來獲得任務的接管權。

半同步/半反應堆可以採用reactor模式,也可以採用proactor模式處理,另外兩種i/o模式的區別參考:i/o設計模式

半同步/半反應堆中,非同步執行緒是主線程,負責監聽所有的socket事件,如果監聽socket上有可讀事件發生,指的是新的連線到來,那麼非同步執行緒接受它,插入到請求佇列中,空閒工作執行緒開始競爭任務,之後這個執行緒管理這個socket的所有i/o任務,直到客戶關閉連線,工作執行緒各自監聽管理不同的事件,所以不需要通訊,每個執行緒都是非同步模式。

缺點:對此進行佇列操作是,都需要加鎖解鎖,從而消耗cpu事件,另外乙個執行緒同一時間只能處理乙個客戶請求,如果佇列中積累了很多任務,如果增加工作執行緒,工作執行緒的切換也會耗費大量cpu時間。

改進:工作執行緒可以呼叫epoll_wait,這樣乙個工作執行緒也可以處理多個客戶請求。

領導者/追隨者模式

UNIX網路程式設計 併發伺服器(多程序)

以下程式的源 均是unix網路程式設計上的例子程式。intro daytimetcpsrv1.c include unp.h include include apueerror.h int main int argc,char argv tcp一般採用併發伺服器。當服務乙個客戶請求可能花費較長時間時...

高效併發伺服器模型

1 單執行緒 阻塞 同步模型 適用範圍 單一連線 缺點 多連線時相互影響,乙個阻塞,別的也得不到響應 2 多程序 阻塞 同步模型 適用範圍 連線數較少,且使用的資源較多,比如檔案操作 缺點 系統程序數有上限,不適用大量併發連線,且程序間切換開銷較大 3 多執行緒 阻塞 同步模型 適用範圍 連線數較少...

高效併發伺服器模型

1 單執行緒 阻塞 同步模型 適用範圍 單一連線 缺點 多連線時相互影響,乙個阻塞,別的也得不到響應 2 多程序 阻塞 同步模型 適用範圍 連線數較少,且使用的資源較多,比如檔案操作 缺點 系統程序數有上限,不適用大量併發連線,且程序間切換開銷較大 3 多執行緒 阻塞 同步模型 適用範圍 連線數較少...