Linux下tcp併發伺服器的幾種設計的模式套路

2022-05-03 19:27:11 字數 3571 閱讀 6859

在做網路服務的時候tcp併發服務端程式的編寫必不可少。tcp併發通常有幾種固定的設計模式套路,他們各有優點,也各有應用之處。下面就簡單的討論下這幾種模式的差異:

1、 單程序,單執行緒模式

在accept之後,就開始在這乙個連線連線上的資料收接收,收到之後處理,傳送,不再接收新的連線,除非這個連線的處理結束。

優點:簡單。

缺點:因為只為乙個客戶端服務,所以不存在併發的可能。

應用:用在只為乙個客戶端服務的時候。

2、 多程序模式

accept返回成功時候,就為這乙個連線fork乙個程序,專門處理這個連線上的資料收發,等這個連線處理結束之後就結束這個程序。

優點:程式設計相對簡單,不用考慮執行緒間的資料同步等。

缺點:資源消耗大。啟動乙個程序消耗相對比啟動乙個執行緒要消耗大很多,同時在處理很多的連線時候需要啟動很多的程序多去處理,這時候對系統來說壓力就會比較大。另外系統的程序數限制也需要考慮。

應用:在客戶端資料不多的時候使用很方便,比如小於10個客戶端。

3、 多執行緒模式

類似多程序方式,但是針對乙個連線啟動乙個執行緒。

優點:相對多程序方式,會節約一些資源,會更加高效一些。

缺點:相對多程序方式,增加了程式設計的複雜度,因為需要考慮資料同步和鎖保護。另外乙個程序中不能啟動太多的執行緒。在linux系統下執行緒在系統內部其實就是程序,執行緒排程按照程序排程的方式去執行的。

應用:類似於多程序方式,適用於少量的客戶端的時候。

4、 select + 多執行緒 模式

有乙個執行緒專門用於監聽埠,accept返回之後就把這個描述符放入 描述符集合 fd中,乙個執行緒用select去輪訓描述符集合,在有資料的連線上接收資料,另外乙個執行緒專門傳送資料。當然也可以接收和傳送用乙個執行緒。描述符可以設 置成非阻塞模式,也可以設定成阻塞模式。通常連線設定成非阻塞模式,傳送執行緒獨立出來。

優點:相對前幾種模式,這種模式大大提高了併發量。

缺點:系統一般實現描述符集合是採用乙個大陣列,每次呼叫select的時候都會輪詢這個描述符陣列,當連線數很多的時候就會導致效率下降。連線數在1000以上時候效率會下降到不能接受。

應用:目前windows 和一般的unix上的tcp併發都採用select方式,應該說應用還是很廣泛的。

5、 epoll方式

在linux2.6版本之後,增加了epoll。具體的使用是:乙個執行緒專門進行埠監聽,accept接收到連線的時候,把該連線設定成非阻塞模式,把 epoll事件設定成邊緣觸發方式,加入到epoll管理。接收執行緒阻塞在epoll的等待事件函式。另外乙個執行緒專門用於資料傳送。

優點:由於epoll的實現方式先進,所以這種方式可以大規模的實現併發。我們現在的應用在乙個3年前的dell的pc server可以實現2萬個連線的併發,效能也是很好的。

缺點:由於涉及了執行緒和非阻塞,所以會導致編碼的複雜度增大一些。這種方式只適用於linux 2.6

核心以後。

注意:   

1。 如果把epoll事件設定成水平觸發效率就下降到類似採用select的水平。

2。 unix系統下有單個程序開啟的描述符數目限制,還有系統內開啟的描述符數目限制。系統內開啟的描述符數目限制由軟硬限制兩個。硬限制是根據機器的配置而 不同。軟限制可以更改,但是必須小於系統的硬限制。在suse linux下,可以在root使用者下,通過ulimit -n 數目  去修改這個限制。

應用:linux下大規模的tcp併發。

當前 併發還有其他的方式,比如程序池,執行緒池等,每種模式都有它的優點和缺點,在適當的情況用合適的模式是最重要的。

如果需要很大規模的併發,經過測試,個人建議採用epoll方式,放棄通常的select方式。

在做網路服務的時候tcp併發服務端程式的編寫必不可少。tcp併發通常有幾種固定的設計模式套路,他們各有優點,也各有應用之處。下面就簡單的討論下這幾種模式的差異:

1、 單程序,單執行緒模式

在accept之後,就開始在這乙個連線連線上的資料收接收,收到之後處理,傳送,不再接收新的連線,除非這個連線的處理結束。

優點:簡單。

缺點:因為只為乙個客戶端服務,所以不存在併發的可能。

應用:用在只為乙個客戶端服務的時候。

2、 多程序模式

accept返回成功時候,就為這乙個連線fork乙個程序,專門處理這個連線上的資料收發,等這個連線處理結束之後就結束這個程序。

優點:程式設計相對簡單,不用考慮執行緒間的資料同步等。

缺點:資源消耗大。啟動乙個程序消耗相對比啟動乙個執行緒要消耗大很多,同時在處理很多的連線時候需要啟動很多的程序多去處理,這時候對系統來說壓力就會比較大。另外系統的程序數限制也需要考慮。

應用:在客戶端資料不多的時候使用很方便,比如小於10個客戶端。

3、 多執行緒模式

類似多程序方式,但是針對乙個連線啟動乙個執行緒。

優點:相對多程序方式,會節約一些資源,會更加高效一些。

缺點:相對多程序方式,增加了程式設計的複雜度,因為需要考慮資料同步和鎖保護。另外乙個程序中不能啟動太多的執行緒。在linux系統下執行緒在系統內部其實就是程序,執行緒排程按照程序排程的方式去執行的。

應用:類似於多程序方式,適用於少量的客戶端的時候。

4、 select + 多執行緒 模式

有乙個執行緒專門用於監聽埠,accept返回之後就把這個描述符放入 描述符集合 fd中,乙個執行緒用select去輪訓描述符集合,在有資料的連線上接收資料,另外乙個執行緒專門傳送資料。當然也可以接收和傳送用乙個執行緒。描述符可以設 置成非阻塞模式,也可以設定成阻塞模式。通常連線設定成非阻塞模式,傳送執行緒獨立出來。

優點:相對前幾種模式,這種模式大大提高了併發量。

缺點:系統一般實現描述符集合是採用乙個大陣列,每次呼叫select的時候都會輪詢這個描述符陣列,當連線數很多的時候就會導致效率下降。連線數在1000以上時候效率會下降到不能接受。

應用:目前windows 和一般的unix上的tcp併發都採用select方式,應該說應用還是很廣泛的。

5、 epoll方式

在linux2.6版本之後,增加了epoll。具體的使用是:乙個執行緒專門進行埠監聽,accept接收到連線的時候,把該連線設定成非阻塞模式,把 epoll事件設定成邊緣觸發方式,加入到epoll管理。接收執行緒阻塞在epoll的等待事件函式。另外乙個執行緒專門用於資料傳送。

優點:由於epoll的實現方式先進,所以這種方式可以大規模的實現併發。我們現在的應用在乙個3年前的dell的pc server可以實現2萬個連線的併發,效能也是很好的。

缺點:由於涉及了執行緒和非阻塞,所以會導致編碼的複雜度增大一些。這種方式只適用於linux 2.6

核心以後。

注意:   

1。 如果把epoll事件設定成水平觸發效率就下降到類似採用select的水平。

2。 unix系統下有單個程序開啟的描述符數目限制,還有系統內開啟的描述符數目限制。系統內開啟的描述符數目限制由軟硬限制兩個。硬限制是根據機器的配置而 不同。軟限制可以更改,但是必須小於系統的硬限制。在suse linux下,可以在root使用者下,通過ulimit -n 數目  去修改這個限制。

應用:linux下大規模的tcp併發。

當前 併發還有其他的方式,比如程序池,執行緒池等,每種模式都有它的優點和缺點,在適當的情況用合適的模式是最重要的。

如果需要很大規模的併發,經過測試,個人建議採用epoll方式,放棄通常的select方式。

TCP併發伺服器

int main int recvcnt 0 struct sockaddr in sock server struct sockaddr in sock client int len sizeof struct sockaddr socketfd socket pf inet,sock strea...

TCP併發伺服器程式

include include include include include define portno 3333 define size 1024 int main bzero server addr,sizeof struct sockaddr in server addr.sin famil...

Linux下搭建tcp伺服器

include see notes include include include include include include include include socket bind listen accept send recv define server port 8888 define b...