我對如何在多核處理器中調度任務感到困惑。其實,不同的訊息來源有不同的看法。重要的是,關于多核處理器中的任務調度機制沒有足夠的檔案。因此,我決定問你一個問題。
我描述了一個包含行程內核執行緒和兩個用戶級執行緒的行程。并提供有關處理邏輯的偽代碼。

問題是,如何在包含 2 個物理內核和 4 個邏輯處理器(每個內核有 2 個)的多核處理單元中執行此程序。這樣,就沒有任何等待的行程,CPU 完全分配給了行程。
我想它的作業原理如下:
注:PKT_C1_LP1 表示行程內核執行緒分配給核心 1和邏輯處理器 1
|--PKT_C1_LP1--1s--| |--T1_C1_LP1--1s--| |--TSK1_C1_LP1--1s--|
|--T2_C1_LP2--2s-----------| |--TSK2_C1_LP2--1s--|
----------- timeline ----------->
更新
似乎您的問題的答案在很大程度上取決于您的系統正在運行的作業系統和調度程式。
因為沒有任何等待行程,也沒有足夠的資源。所以我相信幾乎任何作業系統中的所有調度演算法都會有微不足道的差異。但是,讓我們說,為簡單起見,它是:
non-preemptive FCFS scheduling
uj5u.com熱心網友回復:
這是每個執行緒需要執行的代碼的時序圖。這想象了一個最大的情況,其中每個任務立即產生一個新執行緒。綠色部分是非常短的代碼段(想想“不按比例”),但基本上只是調度操作。紅色部分是類似的短行程 EXIT 和執行緒 END 調度操作。(我已經省略了與執行緒創建相關的懲罰。請注意,作業執行緒并沒有結束,它們只是閑置,并且停留在執行緒池中。
基本時序圖

現在你會注意到的第一件事是,由于任務的作業方式,第二個任務可以在調度它的同一個執行緒上執行,因為沒有更多的任務被調度,執行緒只會等待那個任務。這與執行緒調度無關,而與任務如何有效地管理其作業執行緒池有關。這是應用程式級代碼,而不是實作此目的的作業系統級代碼。由于任務,下圖需要減少 1 個執行緒。
具有更智能任務的時序圖

現在我們可以看看調度器需要做什么。我們仍然只處理邏輯處理器。(哪個內核將執行哪個執行緒的細節很復雜,所以我們暫時將其擱置一旁。)在這里我們看到,我們可以在自己的處理器上天真地執行所有這些執行緒。
處理器的貪婪使用

在先前的處理器之一上執行作業執行緒可能會更有效。當作業執行緒 1需要執行時,它們處于空閑狀態,因此重用先前分配的處理器之一更有意義。此處顯示了作業執行緒 1 中的任務 1代碼在處理器 2 上執行(也可能已分配給處理器 1,因為它也是空閑的,但請繼續關注下圖,您將明白我為什么將它放在處理器 2 上)。
調度執行緒以重用處理器

最后,我們可以構建將我們帶到最有效調度的最后一個版本。這取決于優化創建執行緒然后立即加入執行緒的情況. 不同的作業系統嘗試優化這種情況,以便新創建的執行緒可以在同一處理器上運行。這意味著創建執行緒不會立即在空閑處理器上調度新執行緒,而是將背景關系切換的成本消耗回呼度它的執行緒。相反,當我們在 Join 操作中阻塞時,或者在下一個時鐘中斷發生時調度新執行緒。如果我們可以在中斷觸發調度程式之前快速進入我們的 Join 呼叫(我們在典型的作業系統上談論 < 10 ms 以便由時鐘芯片觸發此類事情),那么調度將像這樣更有效地發生(如下) ),其中執行緒 2可以在沒有背景關系切換的情況下安排在同一處理器上運行。(有趣的是,Linux 和 Windows 對這種情況的優化不同。)
Final timing diagram

You'll notice (above) that this can now all execute on only two logical processors.
Whether it is more efficient to run these on separate cores or different logical processors of the same core is a nuance of the operating system again that depends highly on virtual memory usage and also the hardware specs of the processor and its caches. Different operating systems will do different things here, too. And the details matter greatly. Non-uniform memory architecture would affect the decision too.
In the real world, the operating system may use heuristics to determine the best priority and placement for threads and processes. The real world answer is so much different and more nuanced than this "computer science" answer I've given and depends on the specific details.
Additional Reading/Viewing:
- Windows and Linux: A Tale of Two Kernels - Tech-Ed 2004 (Older but excellent info)
- Processes, Threads, and Jobs in the Windows Operating System
- Scheduling: Introduction; and Multiprocessor Scheduling (Advanced)
- Capacity Aware Scheduling
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325556.html
