這是一個相當普遍的計算機科學問題,並不針對任何操作系統或框架。線程池和上下文切換(任務)?
所以我有點困惑與線程池上切換任務相關的開銷。在許多情況下,爲每個作業提供自己的特定線程(我們不想創建太多硬件線程)是沒有意義的,所以我們把這些作業放到可以安排在線程上運行的任務中。我們建立了一個線程池,然後動態分配任務以在從線程池獲取的線程上運行。
對於在特定線程(在線程池中)切換任務相關的開銷,我只是有點困惑(無法找到深入的答案)。 DrDobbs的一篇文章(來源於下文)說明了它的作用,但我需要更深入地回答實際發生的事情(可以引用的來源會非常棒:))。
根據定義,SomeWork必須在池中排隊,然後在 上運行與原始線程不同的線程。這意味着我們必然 招致排隊開銷加上一個上下文切換隻是將工作移動到 池。如果我們需要將回答傳回原始線程(例如通過消息或Future或類似的),我們將爲此另外發送一個上下文切換。
來源:http://www.drdobbs.com/parallel/use-thread-pools-correctly-keep-tasks-sh/216500409?pgno=1
哪些組件的線程的實際切換?線程本身並不實際切換,只是特定於線程的數據。與此相關的開銷是多少(或多或少)?
這開始變得更有意義(有點)。所以「線程池」線程並沒有實際的上下文切換。文章指出有一個上下文切換來排隊任務(即將任務移動到線程池)。你是說同樣的事情嗎?線程池不上下文切換,但任務呢?即將任務從創建任務的線程移動到將運行任務的線程 – smjpl 2014-10-10 18:34:50
任務只是一個數據結構(一個函數指針)。隊列也只是數據。內核不參與排隊任務或執行它們。沒有開關。 – usr 2014-10-10 18:49:26
那麼爲什麼我們需要確保任務足夠大,如果在線程池中排隊和運行任務沒有任何相關開銷?從文章(第1頁):「另一方面,任務不應該太短,因爲執行工作作爲線程池任務存在實際成本。」 – smjpl 2014-10-10 19:05:53