1、CFS调度算法,顾名思义就是完全公平调度策略。
比方说,调度延迟时间是10ms,存在两个进程A和B,那么两个进程分别占用CPU的时间是5ms。然而,阶级总是存在的,毕竟有些进程高贵些,需要消耗更多的时间。因此引入了nice值,
假如A进程nice值是0,对应的权重prio_to_weight是1024;B进程nice值是1,对应的权重prio_to_weight是820。因此,相对应的,A进程占用CPU的时间就变成了10 * 1024 / (1024 + 820)约5.6ms,B进程占用CPU时间10 * 820 / (1024 + 820)约4.4ms。人善被人欺,nice值越大,获取CPU的时间就越少。
此时分配给每个进程的运行时间=sched_latency_ns * 进程权重值 / 运行队列上所有进程权重之和
2、实验例子验证
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <math.h>
#include <sys/resource.h>
#include <sched.h>
int heavy_work()
{
double sum = 0;
unsigned long long i = 0;
while (1) {
sum += sin(i++);
}
return 0;
}
int main()
{
int ret = 0;
cpu_set_t set;
CPU_ZERO(&set);
CPU_SET(0, &set);
ret = sched_setaffinity(0, sizeof(cpu_set_t), &set);
if (ret != 0) {
fprintf(stderr, "failed to bind the process to CPU0 (%s)\n", strerror(errno));
exit(1);
}
ret = fork();
if (0 == ret) {
errno = 0;
ret = setpriority(PRIO_PROCESS, 0, 5); //设置子进程的nice值为5
if ((-1 == ret) && (errno != 0)) {
fprintf(stderr, "[%d] failed to change nice value (%s)\n", getpid(), strerror(errno));
exit(1);
}
}
heavy_work();
return 0;
}
同时,需要内核配置(CONFIG_SCHED_DEBUG=y CONFIG_SCHED_INFO=y)
其中父进程的nice值为0,子进程的nice值为5,父子进程的实际运行时间比1024 : 335,约3 : 1
通过以下命令查看
cat /proc/pid/sched | grep sum_exec_runtime
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)