這是一個有點泛泛的問題。假設我使用Java或VC++創建了一個簡單的應用程序,它創建了兩個線程,並在多核系統中運行該應用程序。如果沒有任何特定的指令爲哪個內核運行,應用程序本身是否會將線程分佈到各個內核?多核處理器中的多線程應用程序
謝謝。
這是一個有點泛泛的問題。假設我使用Java或VC++創建了一個簡單的應用程序,它創建了兩個線程,並在多核系統中運行該應用程序。如果沒有任何特定的指令爲哪個內核運行,應用程序本身是否會將線程分佈到各個內核?多核處理器中的多線程應用程序
謝謝。
應用程序不會分配線程,但OS會。這是它的工作。 :)
有趣的是,在單個運行進程中,線程可以在相當頻繁的內核之間進行交換,因爲其他負載和中斷可能會影響CPU核心。
如果您決定需要指定特定線程可以運行的核心,則操作系統通常會提供一種機制,將線程的「關聯」設置爲特定的cpu。在高級優化場景中這可能是有價值的,以保持特定線程的高速緩存,例如,雖然通常不需要。
操作系統將進程和線程分配給不同的內核。這並不是說你不能影響決策,有些操作系統允許你在決定這一點時進行一些控制。必要時,內核之間的流程也可以移動,以確保核心的良好利用率。
您可以SetThreadIdealProcessor和相關API調用做到這一點在Windows上:
http://msdn.microsoft.com/en-us/library/ms684251(VS.85).aspx
如果你的線程每一個都要求大量的資源,那麼你會希望操作系統對他們在可用內核分配。
我有點擔心線程關聯的混亂,因爲你有效地猜測操作系統的調度程序。例如,您可能會導致您的應用程序響應速度變慢,但以與您的應用程序的主UI線程競爭的方式調度線程。
我通常做法事按以下順序用探查的幫助和一些固定的應用基準,以便我可以比較不同的方法
阿德