Linux线程调度策略以及优先级实验
什么是线程调度策略?
Linux内核共有三种调度算法,他们分别是:
1、SCHED_OTHER 分时调度策略,
2、SCHED_FIFO实时调度策略,先到先服务
3、SCHED_RR实时调度策略,时间片轮转
其中,SCHED_FIFO与SCHED_RR属于实时策略,SCHED_OTHER属于分时策略。
实时策略线程将得到优先调用,实时策略线程根据实时优先级决定调度权值,分时策略线程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的线程将会得到优先调度。
三种调度策略
分时调度策略
SCHED_OTHER 分时调度策略:
非实时的,无法设置优先级
实时调度策略
SCHED_FIFO实时调度策略:
先到先服务。一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃
SCHED_RR实时调度策略:
时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平
调度策略组合情况
所有任务都采用linux分时调度策略(SCHED_OTHER)时:
创建时指定优先级nice值,根据nice值确定在cpu上的执行时间(counter),对每个任务动态优先级的计算(counter+20-nice)结果去选择运行,当这 个时间片用完后(counter减至0)或者主动放弃cpu时,该任务被放在就绪队列末尾(时间片用完)或等待队列(因等待资源而放弃cpu)中。
所有任务都采用FIFO时:
优先级高的先运行,并且该任务将一直占有CPU直到优先级更高的任务就绪或者主动放弃。同优先级先入队列先运行。
所有任务都采用RR时
综合了前两种策略,优先级高的先运行,优先级相同共分时间片,用完时间片的去就绪队列尾。
任务中同时含有实时和分时时
当实时进程准备就绪后,如果当前cpu正在运行非实时进程,则实时进程立即抢占非实时进程。
测试实验
主要目的时测试在不同的调度策略以及不同的优先级设定的状况下,线程的抢占情况。
测试方法主要为在设定线程策略与优先级后,创建三个线程,观察它们的log输出情况以及使用busybox top查看CPU占用情况。
修改线程属性的代码部分如下:
param1.sched_priority = 40; //修改优先级
pthread_attr_setinheritsched(&attr1,PTHREAD_EXPLICIT_SCHED);
pthread_attr_setschedpolicy(&attr1,SCHED_FIFO); //修改调度策略
if(0!=pthread_attr_setschedparam(&attr1,¶m1))
{
printf("setschedpolicy attr1 NG! \n");
}
实验全部代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <sched.h>
#include <assert.h>
#include <time.h>
#if 1
void *Thread1(void* pp)
{
sleep(1);
int i;
int policy;
struct sched_param param;
pthread_getschedparam(pthread_self(),&policy,¶m);
switch(policy)