一、基础知识
1.Linux内核当中有3中调度策略:
- SCHED_OTHER 分时调度策略
- SCHED_FIFO 实时调度策略,先到先服务
- SCHED_RR 实时调度策略,时间片轮转
备注:如果有相同优先级的实时进程(根据优先级计算调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃之后才可以运行这个优先级相同的任务。而RR每个任务都执行一段时间。
2. 获取线程设置的最高和最低优先级函数
int sched_get_priority_max(int policy); //获取实时优先级的最大值
int sched_get_priority_min(int policy); //获取实时优先级的最小值
SCHED_OTHER: 不支持优先级使用,而SCHED_RR/SCHED_FIFO支持优先级使用,他们分别为1-99, 数值越大,优先级越高。
实时调度策略(SCHED_FIFO/SCHED_RR)优先级最大值为99
普通调度策略(SCHED_NORMAL/SCHED_BATCH/SCHED_IDLE),始终返回0,即普通任务调度的函数
3.设置和获取优先级2个主要核心函数:
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param); //创建线程优先级
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param); //获取线程优先级
struct sched_param
{
int __sched_priority;//所有设定的线程优先级
};
param.sched_priority=11; //设置优先级
当操作系统创建线程时,默认线程是SCHED_OTHER,我们也可以通过改变调度策略,使用如下函数:
int pthread_attr_setschedpolicy(pthread_attr_t *attr,int policy); //设置线程调度策略
二、基础案例分析
1.操作系统所支持的优先级测试程序分析
#include <stdio.h>
#include <pthread.h>
#include <sched.h>
#include <assert.h>
static int GetThreadPolicyFunc(pthread_attr_t * pAttr)
{
int iPolicy;
int igp=pthread_attr_getschedpolicy(pAttr,&iPolicy);
assert(igp==0);
switch (iPolicy)
{
case SCHED_FIFO:
printf("Policy is --> SCHED_FIFO. \n");
break;
case SCHED_RR:
printf("Policy is --> SCHED_RR. \n");
break;
case SCHED_OTHER:
printf("Policy is --> SCHED_OTHER. \n");
break;
default:
printf("Policy is -> Unknow.\n");
break;
}
return iPolicy;
}
static void PrintThreadPriorityFunc(pthread_attr_t *pAttr,int iPolicy)
{
int iPriority=sched_get_priority_max(iPolicy);
assert(iPriority!=-1);
printf("Max_priority is : %d\n", iPriority);
iPriority=sched_get_priority_min(iPolicy);
assert(iPriority!=-1);
printf("Min_priority is : %d\n", iPriority);
}
static int GetThreadPriorityFunc(pthread_attr_t * pAttr)
{
struct sched_param sParam;
int irs=pthread_attr_getschedparam(pAttr,&sParam);
assert(irs==0);
printf("Priority=%d\n",sParam.__sched_priority);
return sParam.__sched_priority;
}
static void SetThreadPolicyFunc(pthread_attr_t *pAttr,int iPolicy)
{
int irs=pthread_attr_setschedpolicy(pAttr,iPolicy);
assert(irs==0);
GetThreadPolicyFunc(pAttr);
}
int main(int argc, char *argv[])
{
pthread_attr_t pAttr;
struct sched_param sched;
int irs=pthread_attr_init(&pAttr);
assert(irs==0);
int iPolicy=GetThreadPolicyFunc(&pAttr);
printf("\n Export current configration of priority.\n");
PrintThreadPriorityFunc(&pAttr,iPolicy);
return 0;
}