2013-05-13 99 views
-2

我們知道,在一個進程,線程數量有限制,像1000左右數量多線程的TCP服務器的併發連接

如果我想創建一個基於多線程TCP服務器,

每個線程負責一個連接。

由於有1個進程,線程數量是有限的。

那麼它意味着併發連接的數量也是有限的。

我的理解是否正確?

如果不是,爲什麼?

謝謝

+0

我不知道你建議的線程數量的固定限制的種類(系統資源將施加一個限制,但它的unlikey恰好爲1000)。也就是說,如果你想有效地支持大量的併發連接,你應該考慮使用更少的線程,每個線程使用'select'來等待來自多個套接字中的任何一個線程。 – simonc 2013-05-13 09:25:59

+0

你的意思是,在每個線程中,創建一個int connfd [n]。然後對於我(1,n):connfd [i] = accept()。然後選擇(connfd [n])?有沒有示例源代碼?謝謝! – user1944267 2013-05-13 10:37:31

+1

我鏈接的舊[C10K](http://www.kegel.com/c10k.html)頁面討論了I/O策略和框架。 – Useless 2013-05-13 12:36:47

回答

0

是的,線程的資源限制是由您的操作系統和硬件決定的。

Maximum number of threads per process in Linux?

你從來沒有建立使用每個連接一個線程大規模並行服務器。使用select()或poll()和非阻塞套接字。如果您需要有多個線程處理輸入(在一個進程中無法執行此操作之前確實需要很多線程,並且不應該進行阻塞調用),然後創建一個大小約爲可用的處理器核心,並在可用時處理工作。

關於工人池概念的更多細節。一個線程可以處理從網絡中讀取所有傳入的網絡數據並將其扔到某個地方。但是,還有其他工作要處理這些數據。對於簡單的聊天服務器類型的應用程序,不管有多少連接,一個線程可能負責讀取數據和處理數據。但是,如果您必須對接收到的每個數據塊進行一堆物理計算,則一個線程可能無法處理所有數學算法並保持與傳入網絡數據保持最新狀態。在這種情況下,有一個線程將數據從網絡中取出並放入要處理的數據的同步隊列中。然後有少數或兩個工作線程將數據從隊列中取出並以線程安全的方式進行處理。

如果您嘗試使用數千個線程執行此操作,您會放慢速度。他們都會爭奪系統資源,並且由於他們中的任何一個都沒有獲得他們想要的CPU週期或RAM或CPU高速緩存,實際上你會進展得更慢。

http://en.wikipedia.org/wiki/Thread_pool_pattern

+0

什麼是處理器內核?你的意思是數字CPU?那麼通常它是1或2 – user1944267 2013-05-13 10:33:31

+0

http://en.wikipedia.org/wiki/Multi-core_processor-基本上我的意思是一個很小的數字<20 – xaxxon 2013-05-13 11:13:37

+0

好的,它通常很小。像2或4。所以,你的意思是:在每個線程中,創建一個套接字描述符數組:int connfd [n]。然後對於我(1,n):connfd [i] = accept()。然後選擇(connfd [n])?有沒有示例源代碼? – user1944267 2013-05-13 11:32:40

0

好,每個線程負責一個連接。是一個非常主觀的陳述,我想。因爲如果一個線程能夠處理整個請求,並且沒有留在隊列中的任何積壓,那麼一個單線程就可以處理多個請求。

無論操作系統的線程,通道或連接或內存有多大,操作系統中的所有內容總是會受到限制,真正需要的不僅僅是線程的組合來處理您的整個請求的隊列可能與tose處理線程一起。

+0

人們使用這種方法的最大原因是通常是因爲他們想在處理輸入時進行阻塞呼叫。對於低性能,低連接數的系統,這是一種處理連接的簡單方法,無需擔心如何確保無阻塞。由於阻塞,無論處理過程如何簡單,單個線程都無法處理流量 - 即使它只有兩個連接。 – xaxxon 2013-05-14 03:28:08

1

我們知道,在一個進程,線程數量有限制

如果我想創建一個基於多線程TCP服務器,

TCP服務器基於TCP套接字 - 其他任何東西都是實現細節

每個線程負責一個連接。

不要這樣做。有關詳情,請參閱C10K問題的討論,但從本質上來說,這是特別不鼓勵的,因爲它的規模很差。

由於有1個進程,線程數量是有限的。 然後它意味着併發連接的數量也是有限的。

線程是資源。所有資源都是有限的。 插座也是有限的資源。唯一的問題是你的服務器性能如何,以及是否存在不必要的限制的瓶頸。

我的理解是否正確?

系統資源本質上受到限制是正確的。 你錯在認爲每個客戶端線程都是服務器的可擴展或合理的設計。它有時用於易於編碼比可伸縮性更重要的小型服務器。