2010-08-03 63 views
4

與進程相比,線程是否真的不太可能受益於多核處理器?換句話說,內核會決定在單個內核而不是多個內核上執行線程嗎?Linux:多核CPU中的進程和線程

我在談論屬於同一個進程的線程。

回答

8

我不知道(各種)Linux調度程序如何處理這個問題,但是當線程運行在不同的內核上時,線程間通信變得更加昂貴。

因此,如果還有其他進程需要CPU時間,調度程序可能會決定在相同的CPU 上運行進程的線程。

例如,對於雙核CPU,如果有兩個進程使用兩個線程,並且所有進程都使用CPU時間,則最好在第一個Core上運行第一個進程的兩個線程,兩個線程第二個核心上的另一個進程。

+0

我發現這非常有幫助,謝謝。 – someguy 2010-08-03 11:14:56

2

多個單線程進程對於系統來說比單個多線程進程更昂貴。但他們將從具有相同效率的多核CPU中受益。加上線程間通信比進程間通信便宜得多。如果這些線程真的形成單一的應用程序,我投多線程。

+0

「但是他們將從具有相同效率的多核CPU中受益。通過「他們」,你是在談論進程還是線程? 「但」讓我困惑,對不起。 – someguy 2010-08-03 10:39:02

+1

這不是真的,來自在不同內核上運行的相同進程的兩個線程需要大量內存/高速緩存同步,而單獨進程不需要該內存/高速緩存同步 – 2011-11-26 03:20:29

+0

@tolomea如果您需要同時寫入共享內存,內存一致性成本將適用於任何線程或進程。 OS安排線程和進程; CPU核心將通過任何程序計數器爆炸。大多數主流處理器也至少有一個共享高速緩存級別,並且窺探寫入操作以保持內存視圖一致而不通過主內存。在多個CPU之間共享內存時,這會變得更加昂貴,但同樣不好,無論共享訪問源自何處 – tbone 2012-05-09 07:52:53

2

這是我的新聞。特別是Linux對線程和進程幾乎沒有區別。它們實際上只是共享其地址空間的進程。

+0

顯然它是寫在文檔的某處。不過,我寧願用你的話來說,也不願意傳達一個模糊的謠言。 – someguy 2010-08-03 10:30:49

+0

看看clone()系統調用。 – 2010-08-03 13:21:41

-2

雖然Windows使用光纖和線程我有時會認爲Linux使用進程和線程。 我發現,在編寫多線程流程時,您必須嚴格,迂腐,嚴謹和流血,才能在設計線程的過程中實現利用任何數量的內核的好處的平衡。該進程將運行的機器。

在Linux上,與進程相比,線程是否真的不太可能從多核處理器中受益?沒人知道。

2

共享內存多線程對從工具鏈到開發,調試,推理和測試代碼等所有內容都施加了巨大的複雜性成本。從不使用共享內存多線程,您可以合理使用多進程設計。

@Marcelo是對的,任何像樣的操作系統都會非常類似地處理線程和進程,一些線程的cpu親和性可能會減少多線程進程的多處理器使用率,但是您應該看到任何兩個進程也有一個共同的.text段。

根據複雜性和體系結構設計約束挑選線程與進程,速度幾乎不會進入。

+0

我同意設計應該是第一位的,但是當你說「從不使用共享內存多線程」時,你自相矛盾。我明白你的意思是線程更復雜,但這是誇張的。我將堅持使用線程,除非它使用進程是有意義的(可能用於「多文檔」應用程序)。 – someguy 2010-08-03 21:14:08

1

它實際上全部取決於調度程序,多處理類型和當前運行環境。

假設沒有,測試,測試,測試!

如果你是系統上唯一的多線程進程,多線程通常是一個好主意。

但是,從易於開發的角度來看,有時需要單獨的地址空間和共享數據,特別是在NUMA系統中。

可以肯定的一件事:如果它是'超線程'系統,由於密切的內存共享,線程效率更高。

如果它是一個普通的多核處理..它應該是類似的。

如果是NUMA系統,最好讓數據共享和代碼分離。同樣,這一切都依賴於架構,除非您身在HPC業務中,否則不管性能如何。

如果您在HPC(超級計算)業務中使用TEST !.這完全取決於機器(平均而言,好處是10-25%,如果你說話天數不同,那麼它很重要)