CFS调度算法

2023-05-16

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(使用前将#替换为@)

CFS调度算法 的相关文章

随机推荐

  • 21从零开始学Java之while与do-while循环的用法有什么不同?

    作者 xff1a 孙玉昌 xff0c 昵称 一一哥 xff0c 另外 壹壹哥 也是我哦 千锋教育高级教研员 CSDN博客专家 万粉博主 阿里云专家博主 掘金优质作者 配套项目资料 https github com SunLtd LearnJ
  • NVIDIA刷机+部署ROS操作指南

    说明 xff1a Ubuntu18 04 43 ROS melodic 一 NVIDIA刷机操作步骤 准备工作 xff1a 准备一台台式机作为主机 xff0c 且确保安装了ubuntu双系统或者虚拟机 xff0c 再为NVIDIA控制器准备
  • 权限认证基础:区分Authentication,Authorization以及Cookie、Session、Token

    1 认证 Authentication 和授权 Authorization 的区别是什么 xff1f 这是一个绝大多数人都会混淆的问题 首先先从读音上来认识这两个名词 xff0c 很多人都会把它俩的读音搞混 xff0c 所以我建议你先先去查
  • 22从零开始学Java之你知道return、break与continue的区别吗?

    作者 xff1a 孙玉昌 xff0c 昵称 一一哥 xff0c 另外 壹壹哥 也是我哦 千锋教育高级教研员 CSDN博客专家 万粉博主 阿里云专家博主 掘金优质作者 配套项目资料 https github com SunLtd LearnJ
  • 23从零开始学Java之foreach循环该怎么用?

    作者 xff1a 孙玉昌 xff0c 昵称 一一哥 xff0c 另外 壹壹哥 也是我哦 千锋教育高级教研员 CSDN博客专家 万粉博主 阿里云专家博主 掘金优质作者 配套项目资料 https github com SunLtd LearnJ
  • 24从零开始学Java之如何正确地使用一维数组

    作者 xff1a 孙玉昌 xff0c 昵称 一一哥 xff0c 另外 壹壹哥 也是我哦 千锋教育高级教研员 CSDN博客专家 万粉博主 阿里云专家博主 掘金优质作者 配套开源项目资料 https github com SunLtd Lear
  • 25从零开始学Java之数组扩容与数组拷贝的实现过程与原理分析

    作者 xff1a 孙玉昌 xff0c 昵称 一一哥 xff0c 另外 壹壹哥 也是我哦 千锋教育高级教研员 CSDN博客专家 万粉博主 阿里云专家博主 掘金优质作者 配套开源项目资料 https github com SunLtd Lear
  • 26从零开始学Java之如何对数组进行排序与二分查找?

    作者 xff1a 孙玉昌 xff0c 昵称 一一哥 xff0c 另外 壹壹哥 也是我哦 千锋教育高级教研员 CSDN博客专家 万粉博主 阿里云专家博主 掘金优质作者 配套开源项目资料 https github com SunLtd Lear
  • 27从零开始学Java之详解复杂的二维数组与多维数组

    作者 xff1a 孙玉昌 xff0c 昵称 一一哥 xff0c 另外 壹壹哥 也是我哦 千锋教育高级教研员 CSDN博客专家 万粉博主 阿里云专家博主 掘金优质作者 前言 在前几篇文章中 xff0c 壹哥给大家介绍了Java里的一维数组 x
  • 28从零开始学Java之面向对象和面向过程到底有哪些区别?

    作者 xff1a 孙玉昌 xff0c 昵称 一一哥 xff0c 另外 壹壹哥 也是我哦 千锋教育高级教研员 CSDN博客专家 万粉博主 阿里云专家博主 掘金优质作者 前言 壹哥相信 xff0c 经过你对前面文章中技术点的学习 xff0c 现
  • 29从零开始学Java之如何正确创建Java里的类?

    作者 xff1a 孙玉昌 xff0c 昵称 一一哥 xff0c 另外 壹壹哥 也是我哦 千锋教育高级教研员 CSDN博客专家 万粉博主 阿里云专家博主 掘金优质作者 前言 在上一篇文章中 xff0c 壹哥给大家介绍了面向对象和面向过程的概念
  • 全面图解路由器接口及连接(图)

    路由器所在的网络位置比较复杂 xff0c 既可是内部子网边缘 xff0c 也可位于内 外部网络边缘 同时为了实现强大的适用性 xff0c 它需要连接各种网络 xff0c 这样 xff0c 它的接口也就必须多种多样 对于这些 xff0c 不要
  • blktrace,blkparse,btt工具的制作和使用

    1 软件包交叉编译安装 1 1 blktrace源码下载路径 https git kernel dk cgit blktrace 1 2 源码安装 tar zxvf blktrace 1 2 0 tar gz cd blktrace 1 2
  • cartographer之ceres编译

    1 首先下载ceres xff1b 2 进入ceres目录 xff1b 3 mkdir build amp amp cd build 4 cmake DEIGENSPARSE 5 make 6 sudo make install
  • 一个空文件夹和空文件占多少空间?

    用于显示文件夹和文件大小的命令 span class token function du span h 显示目前在 Linux 系统上的文件系统磁盘使用情况统计 span class token function df span i 一 问
  • 虚拟地址如何访问到物理地址

    环境 xff1a 32bit CPU 一 通过二级页表映射的方式访问物理地址 1 取一级页表的基地址Abase1 2 取虚拟地址的前12bit 31 20 地址O1 3 计算得到新地址Apgd 61 Abase1 amp 0xFFFFF00
  • 添加自定义的section

    一 基本知识点 编译出来的程序 xff08 o so exe ko等等 xff09 都是以elf格式进行排列保存的 elf文件分析情况 xff1a https blog csdn net edonlii article details 87
  • 如何打印堆栈

    一 打印堆栈可以方便问题定位 xff0c 找到具体的函数调用流程 二 打印堆栈的方法 2 1 用户态 include lt stdio h gt include lt stdlib h gt include lt stddef h gt i
  • 内存飞踩问题的几点思考

    1 程序编译 xff0c 链接后生成二进制可执行程序 二进制可执行文件以elf格式实现排列 可以通过readelf S xxxx查看具体section的划分 xff0c 粗略划分如下图所示 在这些section中 xff0c 代码段是只读的
  • CFS调度算法

    1 CFS调度算法 xff0c 顾名思义就是完全公平调度策略 比方说 xff0c 调度延迟时间是10ms xff0c 存在两个进程A和B xff0c 那么两个进程分别占用CPU的时间是5ms 然而 xff0c 阶级总是存在的 xff0c 毕