下圖顯示了一些可以更改優先級值的方法。
圖 6. 如何確定優先級值。 插圖顯示了如何能在執行過程中或應用了 nice 命令之后更改線程調度優先級值。優先級值越小,線程優先級越高。開始時,nice 值缺省為 20 而基本優先級缺省為 40.在執行一些操作及處理器損失后,nice 的值仍為 20 且基本優先級仍為 40.在運行 renice ——5 命令后及使用和以前相同的處理器的情況下,nice 值現在是 15 而基本優先級仍為 40.在以 50 的值發出子例程 setpri() 之后,固定優先級現在是 50 而 nice 值和處理器的使用無關。
線程的 nice 值在創建線程時設置并且在線程的整個生命期中都是常量,除非用戶通過 renice 命令或 setpri()、setpriority()、thread_setsched() 或 nice() 系統調用明確更改了它的值。
處理器損失是一個整數,它通過線程最近的處理器使用來計算。如果每次在一個 10 ms 的時鐘滴答結束時線程受處理器控制,則最近的處理器使用值近似加 1,直到達到最大值 120.每個滴答的實際優先級損失隨著 nice 的值增加。所有線程的最近處理器使用值每秒重算一次。
結果如下:
不固定優先級的線程的優先級隨著其最近處理器使用的增加而變低,反之亦然。這暗示一般來講,某線程最近被分配的時間片越多,則它被分配下一個時間片的可能性越小。
不固定優先級的線程的優先級隨著其 nice 值的增加而變低,反之亦然。
注:使用多處理器運行隊列及其負載平衡機制以后,nice 或 renice 的值對線程的優先級可能沒有預期的影響,因為較低優先級的運行時間可能等于或大于較高優先級的運行時間。要求 nice 或 renice 產生預期效果的線程應該放在全局運行隊列中。
可以使用命令 ps 顯示進程的優先級值、nice 值和短期的處理器使用值。
請參閱「處理器的控制爭用」中對使用 nice 和 renice 命令的更詳細的討論。
請參閱「調諧線程優先級值的計算」,里面有處理器損失計算和最近處理器使用值衰減的詳細信息。
優先級機制也用于 AIX 工作負載管理器中來加強處理器資源管理。因為在工作負載管理器下分類的線程具有的優先級由工作負載管理器管理,它們可能與沒有在工作負載管理器下分類的線程具有不同的優先級行為。
線程的調度策略下面是線程調度策略的可能值:
SCHED_FIFO這種策略的線程被調度后,它會一直運行到結束,除非被阻塞或有一個較高優先級的線程可分派,它將自愿服從處理器的控制。只有固定優先級的線程才能有 SCHED_FIFO 調度策略。
SCHED_RR當一個 SCHED_RR 線程在時間片的末尾有控制權時,它將移動到和它具有相同優先級的可分派線程隊列的尾部。只有固定優先級的線程才能有 SCHED_RR 的調度策略。
SCHED_OTHER這個策略在“POSIX 標準 1003.4a”中作為定義的執行程序進行定義。在每個時鐘中斷時重算運行線程的優先級值意味著該線程可能失去控制權,因為它的優先級值已經超過了另一可分派線程的優先級值。
SCHED_FIFO2該策略和 SCHED_FIFO 相同,只是它允許一個僅睡眠了很短時間的線程在被喚醒時可放置在其運行隊列的頭部。這個時間周期是相似性限制(可用 schedtune -a 進行調節)。該策略僅可用于 AIX 4.3.3 及其后續版本。
SCHED_FIFO3調度策略設置成 SCHED_FIFO3 的線程總是放置在運行隊列的頭部。為了防止屬于 SCHED_FIFO2 調度策略的線程放置在 SCHED_FIFO3 之前,當 SCHED_FIFO3 線程入隊列時更改運行隊列參數,這樣屬于 SCHED_FIFO2 的線程就不滿足使其能夠加入運行隊列頭部時必須滿足的標準。該策略僅可用于 AIX 4.3.3 及其后續版本。
SCHED_FIFO4只要優先級值相差 1,較高優先級的 SCHED_FIFO4 調度類線程就不會搶占當前正運行的低優先級線程。缺省行為是當前運行于某給定 CPU 的低優先級線程被有資格在同一 CPU 上運行的高優先級線程搶占。該策略僅可用于 AIX 5L V5100-01 + APAR IY22854 及其后續版本。
文章來源于領測軟件測試網 http://www.anti-gravitydesign.com/