2011-01-28 57 views
16

another of my questions的評論說,我只能同時運行「很多」線程,這是我在其他地方看到的一個概念。我可以同時運行多少個線程?

作爲線程新手,我該如何確定要使用的最大線程數?或者這是一個「多長時間一串」問題?它取決於什麼?硬件配置還是什麼?

(VB在MS Visual Studio中的.Net 3.5,如果該事項)


更新:有沒有人知道任何的S/W工具,它可能表明多個線程(或任務),或者我應該直接編碼自己的編碼嗎?它會一直嘗試不同的編號直到吞吐量下降?


[Upperdate]近七年後&我們現在有a software recommendations site,所以我asked是否有工具來幫助與此有關。

+2

線程在做什麼? – 2011-01-28 12:43:59

+1

+1好問題。它們每個都發出一個SOAP調用來傳送soem數據並等待它返回 – Mawg 2011-01-28 12:58:52

+1

除了「返回」是異步的,所以它們並不是真的在等待。其他線程可以通過HTTP發送SOAP請求(fcuntion call)後立即運行 – Mawg 2011-01-31 06:29:13

回答

9

這取決於硬件你(可能)不使用計算機理論,但在物理硬件之一,所以你的資源有限。

閱讀:Does Windows have a limit of 2000 threads per process?

而且,即使你可以運行5000+線程,這取決於你的硬件,也可以運行超過10線程相等的程序慢得多。我想你應該看看thread pooling

+1

+1謝謝。這給了我一些看法並開始嘗試去理解。你是否知道任何可以建議多個線程的s/w工具? – Mawg 2011-01-28 12:56:17

+2

我猜測每個CPU核心使用一個線程是一個明智的選擇,但它確實取決於您正在嘗試解決的問題。 – Trinidad 2011-01-28 13:08:44

2

這在很大程度上取決於在機器上 - CPU和內存是主要限制因素(雖然OS限制可能接觸到的話)。

在關於.NET中的thread pool配置也發揮了作用。

+0

+1感謝您的反饋 – Mawg 2011-01-28 12:58:04

8

通常情況下,線程數運行真正同時由CPU和CPU核心(包括超線程)你有數量確定。也就是說,在任何給定的時間,運行的線程(在操作系統中)的數量等於「核心」的數量。

您可以在應用中同時運行多少個線程取決於很多因素。最好的(外行人)號碼是機器上的內核數量,但當然這就像假裝沒有人(沒有其他應用程序))。

坦率地說,我會說在.NET/Windows的多線程做更多的研究,因爲人們往往做更多的「損害」多好,當一個人沒有一個非常深刻的理解。 .NET具有線程池的概念,您需要知道除Windows以外的工作方式。

在.NET 3.5/4.0中,您應該查看任務(Task Parallel Library),因爲庫在確定生成多少個線程(如果有的話)方面做得更好。隨着TPL的線程池得到了一次重大的檢修,它是更聰明的產卵線程和任務竊取等。但你通常使用任務而不是線程。

這是一個複雜的領域,因此,.NET框架引入了任務,以便從線程抽象程序員,從而允許運行時對此很聰明,而程序員只是說出她想要的而不是那麼多怎麼做。

7

每個線程消耗更多的內存(內核堆棧,線程環境塊,線程本地,堆棧....)。AFAIK在Windows中沒有明確的限制,因此約束將是內存(可能是每個線程的堆棧)。

在Linux中的線程更像過程(共享內存),你就受限於:

cat /proc/sys/kernel/threads-max 
0

我能在我目前的老CPU(2005)採用EVGA的CPU運行4個線程一次刻錄機在我的CPU蜂鳴器響起之前(在BIOS菜單中編程)含義我擊中了90 * c。請記住,我們正在討論數據線程一次性工作。一個很好的例子就是一次打開多個程序。但總的來說,這取決於您的CPU在多任務處理方面的表現。 (換句話說,可以處理許多活動線程)來測試是一種安全的方式是下載「ocscanner(由EVGA)」和「CPU溫度計」 OC掃描儀內使用CPU刻錄機測試時,請確保您的溫度不會上升超過90 * c(或者您感覺安全的任何溫度),並查看當前運行的線程數量是否會拋出CPU。從2個線程開始,等待3-5分鐘,同時觀察CPU溫度,添加另一個線程,重複。 (不要試圖當CPU溫度計檢測不到你的溫度!!!)

3

運行密集型任務時,一個很好的經驗法則是運行與物理核心相同的編號計數。

是的,你可以運行更多的任務,但是他們會等待資源(或線程池中的線程)和你的盒子,無論大小如何,都不能100%全部分配CPU核心資源由於背景/其他進程而產生的線程。因此,實例化的任務越多,產生的線程越多,因爲它們超過了實際可能的併發線程(每個核心1個線程),就會發生更多的資源管理,排隊和交換。

的測試我們做了我工作的地方,現在使用的病毒模式,推出更多的任務發現,最佳的是相當接近CPU數量爲上限。與物理核心數量以一對一比率啓動的任務每個任務需要大約1分鐘才能完成。設置爲CPU計數的兩倍,任務時間從平均1分鐘到平均5分鐘的時間完成。從核心計數開始的任務越多,它的幾何結構就越慢。

因此,舉例來說,如果你有8個物理核心,8個任務(使用TPL,並在活動過程基本上是8個併發線程)應該是最快的。您的主線程或進程會創建其他任務和其他後臺進程,但如果該框相對於您的資源利用愉悅而言非常孤立,那麼這些工作將會非常少。

你嚼過的任務隊列或列表基於核心數量的編程任務帽的上漲空間,所以當你部署在不同大小的盒子的應用程序,它會自動調整自身。

以編程方式確定這一點,我們使用

var CoreCount = System.Environment.ProcessorCount/2;

爲什麼除以2,你問?因爲幾乎所有現代處理器都使用邏輯核心或超線程技術。您應該通過自己的測試發現,如果使用邏輯計數,則每項任務的整體速度以及整個過程將顯着下降。物理內核是關鍵。我們看不到一種快速查找物理與邏輯的方法,但對我們的盒子進行的快速調查發現這一切始終如一。 YMMV,但這可能會讓你的速度非常快。

1

從我自己的經驗,使用線程一個好的經驗法則爲CPU密集型的進程,提高性能時是使用相同數量的線程爲核心,除了在超線程系統的情況下,在這種情況下,一個應使用兩倍的內核。可以得出的另一個經驗法則是I/O綁定的過程。這個規則是將每個內核的數量線程翻兩番,除了超線程系統的情況外,那麼可以使每個內核的線程數量增加四倍。

相關問題