執行緒排程與優先順序
阿新 • • 發佈:2018-12-01
linux核心排程三種策略:
1,SCHED_OTHER 分時排程策略,
2,SCHED_FIFO實時排程策略,先到先服務
3,SCHED_RR實時排程策略,時間片輪轉
分時程序則通過nice和counter值決定權值,nice越小,counter越大,被排程的概率越大,也就是曾經使用了cpu最少的程序將會得到優先排程。所以分時排程與優先順序是無關的,在這種排程下,優先順序是無法修改的,預設情況下建立的執行緒採用的分時排程策略。要修改執行緒優先順序需要首先修改核心排程策略。
SCHED_FIFO和SCHED_RR屬於實時排程策略,在RTOS中基本用的也都是這兩種策略。SCHED_RR是時間片輪轉,同一優先順序的執行緒分配相同的時間片進行執行,時間片到了之後,將當前執行緒放到隊尾,執行下一個執行緒。
SCHED_FIFO 情況下,一旦佔有了CPU後,知道執行緒執行完或者主動釋放CPU,才會結束對CPU的佔有。
函式的使用
獲取執行緒可支援的最高和最低優先順序,SCHED_FIFO和SCHED_RR是1-99,數值越大優先順序越高。SCHED_OTHER不支援優先順序。
int sched_get_priority_max(int policy);
int sched_get_priority_min(int policy);
系統建立執行緒時,預設的執行緒是SCHED_OTHER。所以如果我們要改變執行緒的排程策略的話,可以通過下面的這個函式實現。
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
policy引數就是我們的排程策略。
獲取和設定優先順序,一般是獲取當前優先順序,再去設定一下優先順序。
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);
sched_param結構體如下,只有一個元素,就是優先順序
struct sched_param
{
int __sched_priority;
};
修改優先順序程式碼
#include <stdio.h>
#include <pthread.h>
#include <sched.h>
#include <assert.h>
static void show_thread_priority(pthread_attr_t *attr,int policy)
{
int priority = sched_get_priority_max(policy);
assert(priority!=-1);
printf("max_priority=%d\n",priority);
priority= sched_get_priority_min(policy);
assert(priority!=-1);
printf("min_priority=%d\n",priority);
}
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:
printf("policy= SCHED_FIFO\n");
break;
case SCHED_RR:
printf("policy= SCHED_RR");
break;
case SCHED_OTHER:
printf("policy=SCHED_OTHER\n");
break;
default:
printf("policy=UNKNOWN\n");
break;
}
return policy;
}
static void set_thread_policy(pthread_attr_t *attr,int policy)
{
int rs = pthread_attr_setschedpolicy(attr,policy);
assert(rs==0);
get_thread_policy(attr);
}
int main()
{
pthread_t pid;
pthread_attr_t attr;
struct sched_param param1;
int new_pri = 20;
int i,ret;
pthread_attr_init(&attr);
int policy = get_thread_policy(&attr);
printf("show current configuration of priority\n");
show_thread_priority(&attr,policy);
printf("show SCHED_FIFO of priority\n");
show_thread_priority(&attr,SCHED_FIFO);
printf("show SCHED_FIFO of priority\n");
show_thread_priority(&attr,SCHED_RR);
set_thread_policy(&attr, SCHED_FIFO);
pthread_attr_getschedparam(&attr,¶m1);
printf("ori pri:%d\n",param1.sched_priority);
param1.sched_priority = new_pri;
pthread_attr_setschedparam(&attr,¶m1);
pthread_attr_getschedparam(&attr,¶m1);
printf("cur pri:%d\n",param1.sched_priority);
return 0 ;
}
執行結果