Linux下執行緒的排程策略與優先順序

2021-06-08 22:49:06 字數 4448 閱讀 3002

linux核心的三種排程策略:

1,sched_other 分時排程策略,

2,sched_fifo實時排程策略,先到先服務。一旦占用cpu則一直執行。一直執行直到有更高優先順序任務到達或自己放棄

3,sched_rr實時排程策略,時間片輪轉。當程序的時間片用完,系統將重新分配時間片,並置於就緒佇列尾。放在佇列尾保證了所有具有相同優先順序的rr任務的排程公平

linux執行緒優先順序設定

首先,可以通過以下兩個函式來獲得執行緒可以設定的最高和最低優先順序,函式中的策略即上述三種策略的巨集定義:

int sched_get_priority_max(int policy);

int sched_get_priority_min(int policy);

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

設定和獲取優先順序通過以下兩個函式

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)

;param.sched_priority = 51;

//設定優先順序

系統建立執行緒時,預設的執行緒是sched_other。所以如果我們要改變執行緒的排程策略的話,可以通過下面的這個函式實現。

int

pthread_attr_setschedpolicy

(pthread_attr_t

*attr,

int policy)

;

上面的param使用了下面的這個資料結構:

struct sched_param

;

我們可以通過下面的測試程式來說明,我們自己使用的系統的支援的優先順序:

#

include

#include

#include

#include

<

assert

.h>

static

int get_thread_policy(

pthread_attr_t

*attr)

return policy;

}static

void show_thread_priority(

pthread_attr_t

*attr,

int policy)

static

int get_thread_priority(

pthread_attr_t

*attr)

static

void set_thread_policy(

pthread_attr_t

*attr,

int policy)

int main(

void

)

下面是測試程式的執行結果:

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=0set thread policy

set sched_fifo policy

policy= sched_fifo

set sched_rr policy

policy= sched_rrrestore current policy

policy=sched_other

#

include

#include

#include

#include

void thread1(

)printf

("thread 1\n");

}printf

("pthread 1 exit\n");

}void thread2(

)printf

("thread 2\n");

}printf

("pthread 2 exit\n");

}void thread3(

)printf

("thread 3\n");

}printf

("pthread 3 exit\n");

}int main(

)

下面是該程式的其中之一的執行結果:

sudo .

/prio_test

the current user is root

sched_other

sched_rr

sched_rr 1

thread 1

thread 1

thread 1

thread 1

thread 1

thread 1

thread 1

thread 1

thread 1

pthread 1 exit

thread 2

thread 2

thread 2

thread 2

thread 2

thread 2

thread 2

thread 2

thread 2

pthread 2 exit

thread 3

thread 3

thread 3

thread 3

thread 3

thread 3

thread 3

thread 3

thread 3

pthread 3 exit

而不是絕對依靠優先順序的高低,來保證。

不過,從執行的結果上,我們可以看到,

排程策略為sched_rr的執行緒1,執行緒2確實搶占了排程策略為sched_other的執行緒3。這個是可以理解的,由於scher_rr是實時排程策略。

只有在下述事件之一發生時,實時程序才會被另外乙個程序取代。

(1) 程序被另外乙個具有更高實時優先順序的實時程序搶占。

(2) 程序執行了阻塞操作並進入睡眠

(3)程序停止(處於task_stopped 或task_traced狀態)或被殺死。

(4)程序通過呼叫系統呼叫sched_yield(),自願放棄cpu 。

(5)程序基於時間片輪轉的實時程序(sched_rr),而且用完了它的時間片。

基於時間片輪轉的實時程序是,不是真正的改變程序的優先順序,而是改變程序的基本時間片的長度。所以基於時間片輪轉的程序排程,並不能保證高優先順序的程序先執行。

下面是另一種執行結果:

sudo .

/prio_test

the current user is root

sched_other

sched_rr 1

thread 1

thread 1

thread 1

thread 1

thread 1

thread 1

thread 1

thread 1

thread 1

pthread 1 exit

sched_rr

thread 2

thread 2

thread 2

thread 2

thread 2

thread 2

thread 2

thread 2

thread 2

pthread 2 exit

thread 3

thread 3

thread 3

thread 3

thread 3

thread 3

thread 3

thread 3

thread 3

pthread 3 exit

可以看出並沒有每一次都保證高優先順序的執行緒先執行。

Linux下執行緒的排程策略與優先順序

linux核心的三種排程策略 1,sched other 分時排程策略,2,sched fifo實時排程策略,先到先服務。一旦占用cpu則一直執行。一直執行直到有更高優先順序任務到達或自己放棄 3,sched rr實時排程策略,時間片輪轉。當程序的時間片用完,系統將重新分配時間片,並置於就緒佇列尾。...

Linux下執行緒的排程策略與優先順序(二)

分類 嵌入式學習 2010 08 25 15 57 251人閱讀收藏 舉報 include include include include void thread1 printf thread 1 n printf pthread 1 exit n void thread2 printf threa...

Linux下執行緒的排程策略與優先順序(二)

include stdio.h include unistd.h include stdlib.h include pthread.h void thread1 printf thread 1 n printf pthread 1 exit n void thread2 printf thread ...