Kernel

當執行緒實際執行時,POSIX 執行緒與核心的完全公平調度器的調度策略

  • August 9, 2020

我對設置執行緒的策略以及在執行時如何遵循該策略有一些疑問。Pthread 允許將執行緒的調度策略設置為SCHED_FIFO/SCHED_RR/SCHED_OTHER. 我試圖了解這個使用者設置策略是如何工作的,因為 Linux 核心將CFS其用作預設調度程序策略。user-set-policy 會在CFS執行時被覆蓋嗎?如果是這樣,pthread 調度策略有什麼用?

A/ 基本理論3: CFS 不是Linux 下的預設*“調度程序策略” 。*CFS 是 linux 下的預設調度器。

調度程序在所有現有執行緒中選擇那些應該被授予 cpu 時間的執行緒。

此選擇由雜項參數控制,這些參數根據執行緒的調度策略以不同方式考慮。

所有執行緒都有一個調度策略

CFS 下的預設調度策略稱為:SCHED_OTHER有時也標記為 SCHED_NORMAL。

該策略實際上指示調度程序採用nice 值考慮並確保在此策略下執行的所有執行緒之間的公平性。

B/ RUN TIME : 1每個滴答聲(或任何專用中斷)調度程序根據關聯的調度策略和取決於該策略的其他參數維護(重新排序)可執行執行緒的列表(*隊列)。*當重新排序結束時,隊列頂部的執行緒將成為當選的執行緒。

屬於“實時”策略(SCHED_RR / SCHED_FIFO)的執行緒(如果有的話在可執行的情況下)將始終位於列表的頂部。其中,訂單由實時優先級設置管理。

**C:您的問題:**如果在這些情況下,您更改了某個給定執行緒的調度策略(更準確地說:如果某個正在執行的執行緒發出系統呼叫請求更改其調度策略2)那麼,只要它有權執行因此,調度程序將相應地重新排序其隊列。

例如,如果某些 SCHED_OTHER 執行緒更改為 SCHED_RR,它將進入列表頂部,調度程序將忽略它的 nice 值並根據其給定的實時優先級在其他 SCHED_RR 執行緒中對其進行排序。

順便說一句,如果這是您提問的一部分:

  • 調度程序從不決定/強制執行緒的調度策略。
  • 調度程序永遠不會根據調度策略而改變。如果在引導時選擇了 CFS,則 CFS 將始終是調度程序。人們總是可以選擇其他調度程序,一些包含在 CFS 更新檔中,另一些是從頭開始編寫的,它們中的每一個都聲稱成本更小/更好地處理好值/更有效地處理 SCHED_RR 調度策略/當 MAX_CORES <= 4 時更高效,等等. 但是,無論您使用什麼調度程序啟動,都將被保留為唯一的程序調度執行緒,直到關閉。
  • 在任何情況下,調度程序都會根據(大部分時間)它們的父執行緒提供給執行緒的調度策略來調整其行為,很少由它們自己提供。

1:這應在單核環境中考慮。

它可以擴展到任何 SMP / SMP + HT 環境,但要以額外的複雜性為代價來理解,因為可以在核心之間共享(或不共享)隊列並允許執行緒在所有/某些特定的可用核心集上執行。

2:要使用的系統呼叫系列將取決於所使用的 API。

sched_setscheduler()作為標準方式,使用 POSIX API 時使用pthread_setschedparam() 。(函式名稱不同,但結果(對 CFS 的影響)相同)

3 : 有關每個可用調度策略的詳細說明,請參閱sched(7) Linux 手冊頁( man sched.7 ),我毫不懷疑,它是您正在尋找的最值得信賴/信譽良好的來源.

引用自:https://unix.stackexchange.com/questions/602461