任务一
了解
CPU
的几种调度算法,了解其工作原理及其优先级设定等一些相关参数的设置。
使用
pthread_attr_getschedpolicy
方法获取指定线程的调度算法,利用
sched_get_priority_max
和
sched_get_priority_min
可以获取到指定调度算法可以设置的最大
/
最小优先级,
pthread_attr_setschedpolicy
方法可以设置线程的调度算法。
创建一个线程,获取该线程当前的调度算法以及该调度算法可以设置的最大
/
最小优先级,然后再获
取到除该调度算法外的另外两种调度算法的可以设置的最大
/
最小优先级。获取当前线程的优先级,并尝
试手动设置该线程的调度策略,最后恢复该线程的调度策略。
代码段
//需要用到的头文件
#include <unistd.h>
#include <pthread.h>
#include <sched.h>
#include <stdio.h>
//任务中可能用到的一些方法
//获取线程的调度算法
static int get_thread_policy(pthread_attr_t attr)
{
int policy;
pthread_attr_getschedpolicy(&attr, &policy);
switch(policy)
{
//实时调度策略 先到先服务
case SCHED_FIFO:
printf("policy = SCHED_FIFO\n");
break;
//时间片轮转调度算法
case SCHED_RR:
printf("policy = SCHED_RR\n");
break;
//分时调度算法
case SCHED_OTHER:
printf("policy = SCHED_OTHER\n");
break;
default:
printf("policy = UNKOWN\n");
break;
}
return policy;
}
//获取指定调度算法可以设置的最大/最小优先级
static void show_thread_priority(pthread_attr_t attr,int policy)
{
int priority = sched_get_priority_max(policy);
printf("max_priority = %d\n",priority);
priority = sched_get_priority_min(policy);
printf("min_priority = %d\n",priority);
}
//获取给定线程的优先级
static int get_thread_priority(pthread_attr_t attr)
{
struct sched_param param;
pthread_attr_getschedparam(&attr, ¶m);
printf("priority = %d\n", param.sched_priority);
return param.sched_priority;
}
//设置线程的调度算法
static void set_thread_policy(pthread_attr_t attr,int policy)
{
pthread_attr_setschedpolicy(&attr,policy);
get_thread_policy(attr);
}
int main()
{
pthread_attr_t attr;
pthread_attr_init(&attr);
int policy;
policy=get_thread_policy(attr);
printf("curent:show_thread_priority\n");
show_thread_priority(attr,policy);
printf("SCHED_FIFO:show_thread_priority\n");
show_thread_priority(attr,SCHED_FIFO);
printf("SCHED_RR:show_thread_priority\n");
show_thread_priority(attr,SCHED_RR);
printf("SCHED_OTHER:show_thread_priority\n");
show_thread_priority(attr,SCHED_OTHER);
printf("current:get_thread_priority\n");
get_thread_priority(attr);
printf("SCHED_RR:set_thread_policy\n");
set_thread_policy(attr,SCHED_RR);
printf("SCHED_FIFO:set_thread_policy\n");
set_thread_policy(attr,SCHED_FIFO);
printf("reset:set_thread_policy\n");
set_thread_policy(attr,policy);
}