本章主要列舉伺服器程式的各種網路模型,示例程式以及效能對比後面再寫。
一、分類依據。伺服器的網路模型分類主要依據以下幾點
(1)是否阻塞方式處理請求,是否多路復用,使用哪種多路復用函式
(2)是否多執行緒,多執行緒間如何組織
(3)是否多程序,多程序的切入點一般都是accept函式前
二、分類。首先根據是否多路復用分為三大類:
(1)阻塞式模型
(2)多路復用模型
(3)實時訊號模型
三、詳細分類。
1、阻塞式模型根據是否多執行緒分四類:
(1)單執行緒處理。實現可以參見後面的示例**。
(2)乙個請求乙個執行緒。
主線程阻塞在accept處,新連線到來,實時生成執行緒處理新連線。受限於程序的執行緒數,以及實時建立執行緒的開銷,過多執行緒後上下文切換的開銷,該模型也就是有學習上價值。
(3)預派生一定數量執行緒,並且所有執行緒阻塞在accept處。
該模型與下面的(4)類似與執行緒的領導者/追隨者模型。
傳統的看法認為多程序(linux上線程仍然是程序方式)同時阻塞在accept處,當新連線到來時會有「驚群」現象發生,即所有都被啟用,之後有乙個獲取連線描述符返回,其它再次轉為睡眠。linux從2.2.9版本開始就不再存在這個問題,只會有乙個被啟用,其它平台依舊可能有這個問題,甚至是不支援所有程序直接在accept阻塞。
(4)預派生一定數量執行緒,並且所有執行緒阻塞在accept前的執行緒鎖處。
一次只有乙個執行緒能阻塞在accept處。避免不支援所有執行緒直接阻塞在accept,並且避免驚群問題。特別是當前linux2.6的執行緒庫下,模型(3)沒有存在的價值了。另有檔案鎖方式,不具有通用性,並且效率也不高,不再單獨列舉。
(5)主線程處理accept,預派生多個執行緒(執行緒池)處理連線。
類似與執行緒的半同步/半非同步模型。
主線程的accept返回後,將clientfd放入預派生執行緒的執行緒訊息佇列,執行緒池讀取執行緒訊息佇列處理clientfd。主線程只處理accept,可以快速返回繼續呼叫accept,可以避免連線爆發情況的拒絕連線問題,另加大執行緒訊息佇列的長度,可以有效減少執行緒訊息佇列處的系統呼叫次數。
(6)預派生多執行緒阻塞在accept處,每個執行緒又有預派生執行緒專門處理連線。
(3)和(4)/(5)的複合體。
經測試,(5)中的accept執行緒處理能力非常強,遠遠大於業務執行緒,併發10000的連線數也毫無影響,因此該模型沒有實際意義。
總結:就前五模型而言,效能最好的是模型(5)。模型(3)/(4)可以一定程度上改善模型(1)的處理效能,處理爆發繁忙的連線,仍然不理想。。阻塞式模型因為讀的阻塞性,容易受到攻擊,乙個死連線(建立連線但是不傳送資料的連線)就可以導致業務執行緒死掉。因此內部伺服器的互動可以採用這類模型,對外的服務不適合。優先(5),然後是(4),然後是(1),其它不考慮。
2、多路復用模型根據多路復用點、是否多執行緒分類:
使用fcntl的f_setsig操作,把描述符可讀的訊號由不可靠的sigio(system v)或者sigpoll(bsd)換成可靠訊號。即可成為替代多路復用的方式。優於select/poll,特別是在大量死連線存在的情況下,但不及epoll。
四、多程序的參與的方式
(1)fork模型。fork後所有程序直接在accept阻塞。以上主線程在accept阻塞的都可以在accept前fork為多程序。同樣面臨驚群問題。
(2)fork模型。fork後所有程序阻塞在accept前的執行緒鎖處。同執行緒中一樣避免不支援所有程序直接阻塞在accept或者驚群問題,所有程序阻塞在共享記憶體上實現的執行緒互斥鎖。
(3)業務和網路層分離為不同程序模型。這個模型可能是受unix簡單哲學的影響,乙個程序完成一件事情,複雜的事情通過多個程序結合管道完成。我見過程序方式的商業協議棧實現。自己暫時還沒有寫該模型的示例程式測試對比效能。
(4)均衡負載模型。起多個程序繫結到不同的服務埠,前端部署lvs等均衡負載系統,暴露乙個網路位址,後端對映到不同的程序,實現可擴充套件的多程序方案。
總結:個人認為(1)(2)沒什麼意義。(3)暫不評價。(4)則是均衡負載方案,和以上所有方案不衝突。
以上模型的**示例以及效能對比後面給出。
linux socket程式設計(多執行緒)
1,客戶端 include include include include include include include include include include 強調 當客戶端連線伺服器時,伺服器會產生乙個新的檔案描述符 套接字 與客戶端互動,這個新的套接字不是伺服器端的監聽套接字 套接字...
linux socket 程式設計
兩段程式 可用於開發板和主機之間的資料傳輸,很管用!file client.c檔案傳輸客戶端程式示例 本檔案是客戶機的 include for sockaddr in include for socket include for socket include for printf include f...
linux socket程式設計
雙休日無聊透頂,看了四五集 反恐24小時 實在不想看了,於是就想搞linux的socket programming來玩玩,前期資料都準備好 早就想寫個看看了。首先,寫個簡單的client端的程式 呵,其實是copy!server端用的是網上當的乙個除錯工具 一開始用的是以前用過的乙個多執行緒執行的介...