我正在運行程式鏈,其中許多程式喜歡自行決定使用多少內核或執行緒,并且我可以控制資料的磁區方式。
我希望這將是一個火并忘記的情況......因為在作業系統中只會暫停執行緒和行程的產生,直到釋放足夠的資源......但是,唉,隨之而來的是大量的資源競爭。
是否有任何作業系統或作業系統設定(特別是 Linux)可以處理行程/執行緒的爆炸并避免顛簸?
是否有關于如何并行化跨多個步驟和多個級別令人尷尬地并行的作業流的任何指南?是否有任何工具可以幫助設計基于調度范式的策略?
uj5u.com熱心網友回復:
是否有任何作業系統或作業系統設定(特別是 Linux)可以處理行程/執行緒的爆炸并避免顛簸?
執行緒/行程是作業系統資源,與幾乎所有作業系統資源一樣,它們很昂貴。對于行程來說尤其如此,因為從一個行程到另一個行程的背景關系切換具有相當大的開銷(例如,TL??B 重繪 和可能的直接/延遲快取重繪 )并且它們通常在記憶體的不同部分上運行。
在一個行程中使用多個執行緒通常不是什么大問題,只要它們沒有準備好同時被調度。如果是這樣,調度程式需要將它們映射到可用內核上,并且這種調度非常昂貴。實際上,盡管在實踐中使用了啟發式演算法,但調度問題通常是 NP 完全的。調度器需要考慮很多引數,例如 IOs、locks/wait、locality、affinity、fairness、priority 等。另外,每個執行緒都有自己的堆疊(通常為幾個 MiB),因此執行緒數不需要太多大所以不會占用太多記憶體。背景關系從一個執行緒切換到另一個執行緒仍然會導致一些快取問題,因為堆疊位于記憶體中的不同位置,并且可以快速重繪 它們。粒度需要仔細調整。
請注意,您可以在 Linux 上調整調度程式(通常是 IO 調度程式),但是對于您的目標應用程式,某些調度程式可能比其他調度程式表現得更好,但沒有一個是完美的。應用程式級調度在實踐中往往更有效。
是否有關于如何并行化跨多個步驟和多個級別令人尷尬地并行的作業流的任何指南?是否有任何工具可以幫助設計基于調度范式的策略?
如果沒有更多資訊,這很難為您提供幫助,但您可以自己在作業執行緒池(通常是物理或邏輯內核的數量)上安排作業。您可以為此使用綠色執行緒(如纖維)或任務。任務調度的好處有很多:你可以指定依賴在任務之間,從一個任務切換到另一個任務通常比光纖背景關系切換便宜,堆疊可以重用于許多任務(并保存在快取中),您可以根據目標應用程式調整任務的調度。話雖如此,任務調度只有在任務不相互等待時才是好的:在這種情況下它們需要被拆分為多個任務(即繼續)。這并不總是可能的,也不簡單(例如,呼叫外部庫)。在這種特定情況下,纖維更好(但它們也有一些問題)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513756.html
標籤:多线程并行处理
