CFS调度算法

1、CFS调度算法,顾名思义就是完全公平调度策略。

比方说,调度延迟时间是10ms,存在两个进程A和B,那么两个进程分别占用CPU的时间是5ms。然而,阶级总是存在的,毕竟有些进程高贵些,需要消耗更多的时间。因此引入了nice值,

CFS调度算法_第1张图片

假如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 
#include 
#include 
#include 
#include 
#include 

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

CFS调度算法_第2张图片

CFS调度算法_第3张图片 

你可能感兴趣的:(进程管理,算法)