執行緒的基本概念和排程策略

2021-06-02 19:00:27 字數 4314 閱讀 5910

不固定優先順序的執行緒的優先順序隨著其最近處理器使用的增加而變低,反之亦然。這暗示一般來講,某執行緒最近被分配的時間片越多,則它被分配下乙個時間片的可能性越小。 

不固定優先順序的執行緒的優先順序隨著其 nice 值的增加而變低,反之亦然。

注: 使用多處理器執行佇列及其負載平衡機制以後,nice 或 renice 的值對執行緒的優先順序可能沒有預期的影響,因為較低優先順序的執行時間可能等於或大於較高優先順序的執行時間。要求 nice 或 renice 產生預期效果的執行緒應該放在全域性執行佇列中。

三、執行緒排程策略

pthread 排程

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 排程規則。

四、測試源**

在linux下我們可以通過

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,

void *(*start_routine)(void*), void *arg);

來建立執行緒,但是如何設定執行緒的優先順序呢?

在討論這個問題的時候,我們先要確定當前執行緒使用的排程策略,posix提供了

int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);函式來獲取所

使用的排程策略,它們是:sched_fifo, sched_rr 和 sched_other。

我們可以使用

int sched_get_priority_max(int policy);

int sched_get_priority_min(int policy);

來獲取執行緒執行緒可是設定的最大和最小的優先順序值,如果呼叫成功就返回最大和最小的優先順序值,否則返回-1。

從我現在執行的linux系統中,我使用下列程式獲取了對應三種排程策略中的最大和最小優先順序:

policy = sched_other

show current configuration of priority

max_priority = 0

min_priority = 0

show sched_fifo of priority

max_priority = 99

min_priority = 1

show sched_rr of priority

max_priority = 99

min_priority = 1

show priority of current thread

priority = 0

set thread policy

set sched_fifo policy

policy = sched_fifo

set sched_rr policy

policy = sched_rr

restore current policy

policy = sched_other

我們可以看到

sched_other是不支援優先順序使用的,而sched_fifo和sched_rr支援優先順序的使用,他們分別為1和99,

數值越大優先順序越高。 從上面的結果我們可以看出,如果程式控制執行緒的優先順序,一般是用

pthread_attr_getschedpolicy來獲取系統使用的排程策略,如果是sched_other的話,表明當前策略

不支援執行緒優先順序的使用,否則可以。當然所設定的優先順序範圍必須在最大和最小值之間。我們可以通過

sched_get_priority_max和sched_get_priority_min來獲取。

可能網友會問,是否我們可以通過

int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);來設定自己所需的

排程策略呢?我覺得是完全可以的(有些系統需要定義_posix_thread_priority_scheduling),只要

系統實現了對應的呼叫策略。

說了半天,我們還沒有說,在系統允許使用執行緒優先順序別的時候,如何設定優先級別呢?

int pthread_attr_setschedparam(pthread_attr_t *attr, 

const struct sched_param *param);

int pthread_attr_getschedparam(const pthread_attr_t *attr, 

struct sched_param *param);

上面兩個函式分別用於設定執行緒的優先順序,struct sched_param的定義如下

struct sched_param

;使用的測試程式:

#i nclude 

#i nclude 

#i nclude 

#i nclude 

using namespace std;

static int get_thread_policy( pthread_attr_t &attr )

{int policy;

int rs = pthread_attr_getschedpolicy( &attr, &policy );

assert( rs == 0 );

switch ( policy )

{case sched_fifo:

cout 

作者注:以上內容純屬拼湊而成,如果你沒看明白,清直接看源位址。

直接引用文獻(不一定是作者出處):

1、希望之光的部落格

2、itpub論壇

3、ibm aix文件

4、中國原始碼

多執行緒基本概念

什麼是程式 為了完成某項特定的任務,使用某種語言,編寫一組指令的集合 什麼是程序 是乙個正在進行的程式 什麼是執行緒 在乙個程序中,執行的一套功能流程,稱為執行緒 在乙個程序中,執行的多套功能流程,稱為多執行緒 多執行緒程式的優點 1 降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷毀造成...

多執行緒 基本概念

多執行緒和高併發是身為開發人員高階中一直是繞不開的話題,為此專門學習了下,做下總結,作為自己的備忘錄。1.什麼是執行緒 執行緒是作業系統中能夠進行運算排程的最小單位,是程序中的實際運作單位。執行緒本身有乙個供程式執行時的堆疊,同類的多個 執行緒共享一塊記憶體空間。乙個執行緒的生存週期 新建狀態 就緒...

多執行緒基本概念

執行緒同步的真實意思和字面意思恰好相反。執行緒同步的真實意思,其實是 排隊 幾個執行緒之間要排隊,乙個乙個對共享資源進行操作,而不是同時進行操作。因此,關於執行緒同步,需要牢牢記住的第一點是 執行緒同步就是執行緒排隊。同步就是排隊。執行緒同步的目的就是避免執行緒 同步 執行。這可真是個無聊的繞口令。...