2013-02-12 20 views
2

我知道如何用我選擇的語言創建一個線程,並且我瞭解互斥鎖以及共享數據等的危險,但我確信O/S如何管理線程和每個線程的成本。我有一些嚴肅的問題都涉及到,並且顯示我理解的極限的最明確的方式可能是通過這些問題。線程成本

產卵線程的成本是多少?設計軟件時,是否值得擔心?創建線程的成本之一必須是它自己的堆棧指針和進程計數器,然後空間將所有工作註冊表複製到由調度程序移入或移出內核的時間,但還有其他什麼?

一個程序的堆棧可用量是否可以在進程的線程或先到先服務之間平均分配?

我可以以某種方式檢查啓動(程序)核心數的硬件。如果我在有N個內核的機器上運行,我應該將線程數保持爲N-1嗎?

+1

是的。也許。有時。說真的,如果不知道關於什麼操作系統,什麼語言,什麼虛擬機,什麼線程庫等的更多細節,這個問題是不可能回答的。但簡短的回答是小心過早的優化。除非您遇到系統限制,否則我不會擔心它,或者剖析器讓您擔心。 – Gray 2013-02-12 20:12:10

+0

你是如何到達* N-1 *的? – ArjunShankar 2013-02-12 20:18:31

+0

一種理想化的世界方式,讓一個核心爲「其他任務」,或爲所有被鎖定的家庭男孩。 – Tommy 2013-02-12 20:39:12

回答

4

然後空間由調度所有工作registeres的複製,因爲它是在 移動和關閉一個核心的,但還有什麼?

一個不那麼明顯的成本是施加在調度器上的壓力,如果它需要調整數千個線程,它可能會開始窒息。記憶並不是真正的問題。通過正確的調整,你可以獲得一個「線程」來佔用很少的內存,只比它的堆棧多一點。這種調整可能很困難(即直接在linux下使用clone(2)等),但可以完成。

可爲一個程序堆棧的量的過程或 線程之間平分在先到先得

每個線程都有自己的堆棧,通常你可以控制它的大小。

如果我有N個核的機器上運行,我應該保持的 線程數N-1

檢查內核的數量是很容易的,但環境特定的。但是,如果工作負載由CPU密集型操作組成,並且I/O很少,則將線程數限制爲內核數量纔有意義。如果涉及I/O,則可能需要擁有比內核更多的線程。

2

您應該在設計和實施的一切事情中儘可能考慮周全。

我知道每次創建線程時,Java線程堆棧都會佔用大約1MB的空間。 ,所以他們加起來。

線程對於允許長時間運行的活動發生而不阻止所有其他用戶/進程取得進展的異步任務有意義。

線程由操作系統管理。有很多方案,都在操作系統的控制下(例如循環,先到先得等等)

對於我來說,爲每個核心分配一個線程用於某些活動是非常合理的(例如計算密集型計算,圖形,數學等),但這不一定是決定性因素。我開發的一款應用在生產中使用了大約100個活動線程;它不是一臺100核心機器。

+0

+1,yup - 大概是100個線程的大量網絡I/O。 – 2013-02-13 06:57:00

3

要添加到其他優秀的帖子:

「什麼是產生線程的成本是多少?在設計軟件時,是否值得擔心?「

這是如果你的設計選擇之一是經常做這樣的事情。避免此問題的一個好方法是在應用程序啓動時通過使用專用於操作的池和/或應用程序生存線程創建線程一次。線程間信號傳輸比持續線程創建/終止/銷燬快得多,而且更安全/更容易。

有關線程停止,終止,銷燬,線程數量失控,OOM失敗等問題的帖子數量是原生的。如果你可以避免這樣做,那很好。

+0

+1 - 關於池的好點。做得好。 – duffymo 2013-02-12 23:18:00