posix 執行緒排程

2021-04-17 12:46:11 字數 1593 閱讀 7467

thread 排程

posix 定義一種優先順序排程模型,此模型確定任何兩個執行緒相對於對方的重要程度。 每當有乙個以上的執行緒可以執行—執行就緒—時,系統都將選擇具有最高優先順序的執行緒。

posix 執行緒排程語義是按照一種概念模型定義的,在此概念模型中有乙個有效優先順序範圍,並且有一組執行緒列表,每個優先順序分配有乙個列表。根據執行緒的排程優先順序,將 任何可執行的執行緒放置在其中乙個執行緒列表上。執行緒列表內的排序取決於排程策略。因此,每個執行緒都受其排程優先順序及其排程策略控制。

排程策略的作用是定義這些執行緒列表上的操作,如在列表內和列表之間移動執行緒。 不管策略如何,posix 都指定具有最高優先順序的執行緒列表中的第乙個執行緒應為當前執行的執行緒。

排程執行緒優先順序的能力是 posix 標準中的乙個選項,由符號 posix_thread_priority_scheduling 指定。支援此選項的 posix 實現還必須提供給執行緒指定實時排程策略和優先順序的機制。 強制性策略為 sched_fifo、sched_rr 和 sched_other。

sched_fifo(先進先出)策略按執行緒在執行前在列表上存在的時間對列表上的執行緒進行排序。處於列表首位的執行緒通常為在列表上存在時間最長的執行緒, 而處於末尾的執行緒在列表上存在的時間最短。此策略允許乙個執行緒一直執行,直到具有較高優先順序的另乙個執行緒已準備好執行,或者直到當前執行緒自動阻止。如果此 執行緒被佔據,它就繼續處於其執行緒優先順序列表的首位;如果此執行緒阻止,當它再次成為乙個可執行的執行緒時,將被新增到此執行緒所在的優先順序列表的末尾。

sched_rr (迴圈法)策略與 sched_fifo 策略相同,不同的只是執行的執行緒在被佔據之前只能執行有限的時間長度。當超過此固定時限時,執行的執行緒就被放到執行緒優先順序列表的末尾,而現在處於列表首位 的執行緒將成為執行的執行緒。 此策略的作用是確保具有相同優先順序的多個 sched_rr 執行緒能共享處理器。

sched_other 策略是針對具體實現的,相容的 posix 實現必須記錄此策略的行為。 乙個實施可將此策略定義為與 sched_fifo 或 sched_rr 相同,也可以定義為與這兩種策略完全不同的策略。 posix 定義此類策略的目的是為相容的程式提供一種方法來表明這些程式不需要可移植的實時排程策略。

每種排程策略都有乙個優先順序的有效範圍;對於 sched_fifo 和 sched_rr,此範圍必須至少是 32,而對於 sched_other,此範圍是針對具體實現的。 可以從 sched_get_priority_min() 函式和 sched_get_priority_max() 函式確定優先順序的範圍。

pthread 排程爭用範圍和分配域

除執行緒排程策略和執行緒優先順序外,還有其他兩種排程控制: 執行緒排程爭用範圍和執行緒排程分配域。

爭用範圍定義競爭使用處理資源的執行緒集。 posix 定義兩個爭用範圍:系統中的所有執行緒(或 pthread_scope_system)以及乙個程序中的所有執行緒(或 pthread_scope_process)。

系統爭用範圍中的乙個執行緒與系統中所有其他執行緒(包含其他程序中的那些執行緒)爭用資源。 乙個程序中的高優先順序執行緒可阻止其他程序中的系統爭用範圍執行緒執行。

程序爭用範圍內的執行緒在程序內進行排程,這表示只在乙個程序內的所有執行緒間進行排程。 程序爭用範圍通常表示由作業系統選擇要執行的程序,而程序本身包含乙個內部排程程式來試圖針對程序內的執行緒實現 posix 排程規則。

POSIX執行緒(一)

第12章 posix執行緒 在第11章,我們看到在linux中程序是如何被處理的。這些多程序的特性很久以來就是類unix作業系統的特性。有時使用fork建立乙個新程序的代價實在是太大了。在這種情況下,使得乙個程式同時做兩件事情,或者至少看起來是如此是十分有用的。相對應的,我們也許希望以同樣的方式同時...

POSIX執行緒(一)

第12章 posix執行緒 在第11章,我們看到在linux中程序是如何被處理的。這些多程序的特性很久以來就是類unix作業系統的特性。有時使用fork建立乙個新程序的代價實在是太大了。在這種情況下,使得乙個程式同時做兩件事情,或者至少看起來是如此是十分有用的。相對應的,我們也許希望以同樣的方式同時...

POSIX執行緒(一)

第12章 posix執行緒 在第11章,我們看到在linux中程序是如何被處理的。這些多程序的特性很久以來就是類unix作業系統的特性。有時使用fork建立乙個新程序的代價實在是太大了。在這種情況下,使得乙個程式同時做兩件事情,或者至少看起來是如此是十分有用的。相對應的,我們也許希望以同樣的方式同時...