CFS调度算法

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

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值