前言:
内核默认调度算法是循环时间分享策略(SCHED_OTHER或SCHED_NORMAL),实时调度策略分为两种SCHED_RR和SCHED_FIFO,linux系统中,这两个调度策略都有99个优先级,其优先级数值从1(低优先级)~ 99(高优先级),每个优先级又有一个进程队列。
- SCHED_RR :
同优先级的实时进程中,每个进程又是通过获得时间片来分时运行。
不同优先级的实时进程,高优先级的实时进程能够抢占低优先级的实时进程。
- .SCHED_FIFO :
同优先级的实时进程,后进入的进程要等前一个进程释放了CPU,才能够运行。(没有时间片)
不同优先级的实时进程,高优先级的实时进程能够抢占低优先级的实时进程。
SCHED_RR :
a.c
#define _GNU_SOURCE
#include <stdio.h>
#include <sched.h>
#include <string.h>
int main()
{
struct sched_param sd;
cpu_set_t set;
sd.sched_priority=50;
sched_setscheduler(0,SCHED_FIFO,&sd); //设置实时优先级50
CPU_ZERO(&set);
CPU_SET(0,&set);
sched_setaffinity(0,sizeof(cpu_set_t),&set); //设置CPU亲和力
while(1)
{
printf("world\n");
}
return 0;
}
b.c
#define _GNU_SOURCE
#include <stdio.h>
#include <sched.h>
#include <string.h>
int main()
{
struct sched_param sd;
cpu_set_t set;
sd.sched_priority=50; //实时优先级50
sched_setscheduler(0,SCHED_RR,&sd);
CPU_ZERO(&set);
CPU_SET(0,&set);
sched_setaffinity(0,sizeof(cpu_set_t),&set); //设置CPU亲和力
printf("this is SCHED_RR\n");
while(1);
return 0;
}
运行顺序:先运行b进程,再运行a进程。
上图表明,使用SCHED_RR调度策略的a进程,即使b进程已经运行的前提下,由于SCHED_RR策略使用了分配时间片的策略,所以a进程也能够获得时间片来运行。(a,b进程同优先级50)
SCHED_FIFO:
a.c
#define _GNU_SOURCE
#include <stdio.h>
#include <sched.h>
#include <string.h>
int main()
{
struct sched_param sd;
cpu_set_t set;
sd.sched_priority=50; //设置实时优先级50
sched_setscheduler(0,SCHED_FIFO,&sd);
CPU_ZERO(&set);
CPU_SET(0,&set);
sched_setaffinity(0,sizeof(cpu_set_t),&set); //设置CPU亲和力
while(1)
{
printf("world\n");
}
return 0;
}
b.c
#define _GNU_SOURCE
#include <stdio.h>
#include <sched.h>
#include <string.h>
int main()
{
struct sched_param sd;
cpu_set_t set;
sd.sched_priority=50;
sched_setscheduler(0,SCHED_FIFO,&sd); //实时优先级50
CPU_ZERO(&set);
CPU_SET(0,&set);
sched_setaffinity(0,sizeof(cpu_set_t),&set); //设置CPU亲和力
printf("this is SCHED_FIFO\n");
while(1)
return 0;
}
运行顺序:先运行b进程,再运行a进程。
CTRL+C:杀死b进程
上图表明,使用SCHED_FIFO调度策略的b进程会占用CPU,直到:
- 自动放弃CPU
- 被杀死了
- 被高优先级的实时进程抢占运行了