linux 4.1.16 ftrace 进程调度,Linux内核进程调度overview(1)

一、概述

决定何时、如何选择一个新进程运行的这组规则叫做:调度策略(scheduling policy)。

Linux的调度是基于分时技术(time sharing):多个进程以“时间多路复用”方式运行,因为CPU的时间呗分成“片”(slice),给每个可运行进程分配一片。如果当前运行进程的时间片或时限(quantum)到期时,该进程还没有运行完毕,进程切换就会发生。

调度策略也是根据进程的优先级对它们进行分类。在Linux中,进程优先级是动态的:在较长时间内没有运行的进程,会动态提升它们的优先级;相反地,对于在CPU上运行较长时间的进程,会降低它们的优先级来惩罚它们。

所以,实现调度的工具是调度器(scheduler),调度的对象是进程(process),调度的方法是调度策略(包括调度算法)。

二、CPU调度器

这里主要讲了cpu调度器的工作内容和目的:

多个task会共享CPU资源

那如何进行任务切换选择呢?

当前运行的task中止

当前运行的task sleep(wait event)

新task创建,或者sleep的task唤醒了

当前运行的task的时间片用完

那调度器的目标是什么?

公平调度各个task

基于task的优先级来分配时间片

task的respnse时间短

高throughput(task执行成功)

在多个cpu间,负载均衡

低功耗

调度器代码运行开销低

调度器会和工作在一些框架、服务器、PC、嵌入式/手机中。

三、O(1)调度器

在2.6.23(2007)以前,Linux调度器使用的是O(1)调度器:

调度器分140个优先级等级:0-99是RT task,100-139是User task

每个cpu的runqueue有2个数组:Active,Expaired

每个数组都有140个entry,对应每个优先级

每个entry是一条FIFO队列结构的链表

140位的bitmap用来检测每个优先级list

时间片会根据task的优先级进行分配

运行时间expaire的task会从Active数组移动到Expaired数组

当Active数组为空时,就交换2个数组。即,将Expaired数组变为Active;Active(此时为空)变为Expaired

task的入rq和出rq,以及next task的选择都是在固定时间内完成

最后在O(1)调度器已经被CFS替代。

四、当前调度器架构

在kernel 2.6.23(2007)后,由Ingo Molnar引入

在调度的class中,还存在调度policy

不同的调度class,高优先级的,越早执行

task可以在cpu、调度policy、调度class间进行迁移

4.1  调度class

由struce sched_class结构体实现:

structsched_class {const struct sched_class *next;void (*enqueue_task) (struct rq *rq, struct task_struct *p, intflags);void (*dequeue_task) (struct rq *rq, struct task_struct *p, intflags);

...struct task_struct * (*pick_next_task) (struct rq *rq, struct task_struct *prev, struct rq_flags *rf);

...

};

内核中一共有5中调度class,优先级从高到低:STOP > DL > RT > CFS > IDLE,他们通过链表实现,并链接起来的。

4.2  主调度函数Schedule()

内核中进程调度,最主要的实现是Schedule()函数。它完成如下工作:

选取下一个runnable的task,并将task放在cpu上运行

按class优先级搜索task来运行,最先从STOP class开始

轮询搜索:for_each_class()

实现方式:pick_next_task():

again:

for_each_class(class) {

p= class->pick_next_task(rq, prev, rf);if(p) {if (unlikely(p ==RETRY_TASK))gotoagain;returnp;

}

}/*The idle class should always have a runnable task:*/BUG();

4.3  调度class与policy

在不同的调度class下,可能会有不同的调度policy实现:

● Stop

○ No policy

● Deadline

○ SCHED_DEADLINE

● Real Time

○ SCHED_FIFO

○ SCHED_RR

● Fair

○ SCHED_NORMAL

○ SCHED_BATCH

○ SCHED_IDLE

● Idle

○ No policy

不同的class代表不同的调度优先级;不同的policy同样也意味着不同的调度方式。

4.4  调度class:STOP

STOP类型的class有如下特点:

是最高优先级的class(但是这个class不开放给系统user使用的)

只能在smp系统上可用(stop_machine()在单核处理器下不可用)------括号内的具体没怎么理解

可以抢占所有task,并任何事件都不能抢占它

实现方式是:停止运行的其他所有task,而在cpu上运行一个特定的函数

没有调度policy

属于stop class的per cpu内核线程:migration/N ------“N”为cpu core number

在以下情况下使用:task迁移、CPU hotplug、RCU、ftrace、cloclevents等

4.5  调度class:Deadline(DL)

Deadline类型的class有如下特点:

在kernel 3.14(2013),由Dario Faggioli & Juri Lelli引入

在系统中,属于可以使用的最高优先级的class

调度policy为SCHED_DEADLINE

由红黑树结构实现(自平衡树)

在以下情况下使用:周期性的实时task,例如:视频编解码

4.6  调度Real-time(RT)

Real-time类型的class有如下特点:

符合POSIX标准要求

task优先级范围:0-99

优先级在kernel和userspace中相反:0在kernel中,代表最高优先级;而在userspace中代表最低优先级

相同优先级下的调度policy:

SCHED_FIFO

SCHED_RR,默认时间片长度为100ms

由链表实现

在以下情况下使用:latency敏感的task,例如:IRQ threads

4.7  调度CFS(Completely Fair Scheduler)

CFS类型的class有如下特点:

由Ingo Molnar引入

调度policy:

SCHED_NORMAL:普通task

SCHED_BATCH:批处理 task(batch task,非交互型)

SCHED_IDLE:低优先级task

由红黑树结构实现

跟踪task的虚拟运行时间(vruntime,task拥有的运行时间)

虚拟运行时间(vruntime)最短的task,最优先运行

task的优先级作为权重,会影响虚拟运行时间的计算(vruntime)

权重越大,虚拟运行时间(vruntime)计算时的增量就越小

task的优先级计算:120+nice值(nice范围:-20 ~ +19)

用于所有其他类型的task,例如:shell

4.7  调度Idle

Idle类型的class有如下特点:

最低优先级的调度class

没有调度policy

属于idle class的per cpu内核线程(idle):swapper/N ------“N”为cpu core number

idle线程仅会在没有其他task的情况下,在cpu上运行

idle线程可以让cpu进入低功耗状态

五、Runqueue

每个CPU都由一个struct rq的实例

每个”rq“包含了DL、RT、CFS的runqueue

Runnable的task会被压入上面提到的那些runqueue中

在struct rq中由很多其他的信息和状态

structrq {

...structcfs_rq cfs;structrt_rq rt;structdl_rq dl;

...

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

postman测试工具,如何对参数使用md5加密

先创建环境变量password,并定义了变量值(例如:123456)访问登录接口通常是post提交登录用户名称和登录密码,且以json格式提交,所以在body-raw-json,填写json串如下图所示: 接着在pre-…

开源java性能分析工具_Java性能监控:您应该知道的5个开源工具

开源java性能分析工具鲜为人知但有用:开源应用程序性能监视的状态 对于任何应用程序来说,最重要的事情之一就是性能。 我们要确保用户获得他们能获得的最佳体验,并想知道我们的应用已启动并正在运行。 这就是为什么我们大多数人至少使用一种…

cmd编译可以通过执行没有结果_Go语言是如何完成编译的

Go语言是一门需要编译才能运行的编程语言,也就说代码在运行之前需要通过编译器生成二进制机器码,随后二进制文件才能在目标机器上运行,如果我们想要了解Go语言的实现原理,理解它的编译过程就是一个没有办法绕过的事情。预备知识想…

修改linux资源限制参数命令,linux passwd命令参数及用法详解--linux修改用户密码命令...

名称:passwd使用权限:所有使用者使用方式:passwd [-k] [-l] [-u [-f]] [-d] [-S] [username]说明:用来更改使用者的密码参数:-k keep non-expired authentication tokens-l 关闭账号密码。效果相当于rmod.html target…

如何通过postman测试需要登录授权的接口

思路 请求需要登录授权的接口,就意味着你要传token给接口,所以请求接口(要测试的接口)之前就要先获取token,因为登录成功后服务端才会返回token,而token又设置了时效,所以每次请求接口&#xf…

junit 静态方法_预期异常规则和模拟静态方法– JUnit

junit 静态方法今天,我被要求使用RESTful服务,所以我按照Robert Cecil Martin的TDD规则开始实施它,并遇到了一种测试预期异常以及错误消息的新方法(对我来说至少是这样),因此考虑共享我的实现方法作为这篇文…

wordpress linux 目录,快速搭建WordPress(Linux)

作者:彭济环境要求一、配置LAMP(LinuxApacheMysqlPHP)1、安装apachesudo apt-get install apache2 //安装apache2apache2 -v //查看版本网页访问本机ip地址,查看是否安装成功2、安装phpsudo apt-get install php //安装phpphp -v //查看版本sudo apt-get…

postman测试工具中的js代码中的sendRequest()使用详解

发送get请求 const url http://115.28.108.130:5000/api/user/getToken/?appid136425; // 发送get请求 pm.sendRequest(url, function (err, res) {console.log(err ? err : res.text()); // 控制台打印请求文本 });发送表单格式post请求 //构造一个登录请求 const login…

atheros蓝牙设备驱动 小米_小米Air 13笔记本黑苹果WiFi蓝牙硬件改装方案二

该方案适合小米笔记本Air 13初代,适合小米笔记本PRO等型号,适合通用的预留有M.2 PCIE通道SSD卡槽的电脑。也是作者极力推荐的终极改造方案。总体方案: 使用笔记本主板上的M.2 nvme通道 SSD硬盘接口进行拓展。使用BCM943602CS专用的M.2[NGFF]转接卡进行改…

将经过身份验证的用户注入Spring MVC @Controllers

可以使用AuthenticationPrincipal批注和AuthenticationPrincipalArgumentResolver这是Spring MVS MethodArgumentResolver的实现)将注入经过身份验证的用户注入Spring MVC处理程序方法。 默认情况下, AuthenticationPrincipalArgumentResolver已通过Web安…

Oracle数据库的命令工具sql*plus/sqlplus介绍

Oracle 的 sql*plus 是与 Oracle 数据库进行交互的客户端工具,借助 sql*plus 可以查看、修改数据库记录。在 sql*plus 中,可以运行sql*plus 命令与 SQL 语句。MySQL 中的 mysql、show、mysqldump 等命令就类似于 Oracle 的 sql*plus 客户端命令。 SQL 语…

python实现局域网攻击_通过python实现DNS欺骗

假设在一个的局域网内有两个人:Bob和Eve。Eve想让Bob访问他创建的恶意网页,这样她就可以通过隐藏性的下载给Bob的计算机上安装恶意软件,或者可能展示一个欺骗性的站点来试图窃取Bob的认证信息。(图片来自以上提供的链接&#xff0…

查询linux kafka安装目录,Kafka 1.0.0安装和配置--Linux篇

阅读目录:1. 关闭防火墙和Selinux2. 安装所需环境JDK,Zookeeper3. 下载Kafka 1.0.0版本4. 配置Kafka5. 启动Kafka并验证6. 报错及解决7. 说明1. 关闭防火墙和SelinuxLinux的防火墙是咱们新手的噩梦,很多情况会出现能ping通,但是访问不了Web页…

随机数生成java代码_Java Bullshifier –生成大量随机代码库

随机数生成java代码生成大量随机Java应用程序的命令行工具 您一直在等待的命令行工具。 或不。 毕竟,这是很深奥的。 无论哪种方式,它对某些人都非常有用,而对其他人来说却是一个有趣的实用程序。 Bullshifier是David Levanon和Hodaya Gamli…

背景区域为负样本什么意思_词向量-skipgram与负采样

大纲:1. onehot vs 分布式表示2. 分布式表示的全局泛化能力3. how to learn word2vec - intuition4. SkipGram5. SkipGram Negative Sampling6. 评估词向量7. CBOW与SkipGram对比1. onehot vs 分布式表示Onehot表示:V (apple, going, I, home, machine ,learing)ap…

嵌入式linux应用程序实例,嵌入式Linux应用程序访问物理地址的实例

前言  按照Linux分层驱动思想,外设驱动与主机控制器的驱动不相关,主机控制器的驱动不关心外设,而外设驱动也不关心主机,外设访问核心层的通用应用程序接口进行数据传输,主机和外设之间可以进行任意的组合。这样思想要…

生成验证码图片的Java代码

文章目录验证码演示代码请求资源路径为什么要添加一个随机数的参数验证码演示代码 package priv.lwx.javaex.servlet_demo.web.servlet.response;import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import …

线程同步 线程安全_同步装饰器来替换线程安全类

线程同步 线程安全您知道什么是线程安全吗? 如果没有,下面是一个简单的示例。 所有类都必须是线程安全的,对吗? 并不是的。 其中一些必须是线程安全的? 又错了。 我认为它们都不必是线程安全的,而它们都必须…

python数学要求_python数学工具之积分(1)

加载库Polygon,绘制积分图形。 fig, ax plt.subplots(figsize(7, 5))表示绘图尺寸为7*5;plt.plot(x, y, b, linewidth2)表示绘制蓝色线宽为2的函数图形;plt.ylim(ymin0)表示y轴最小值为0;Ix np.linspace(a, b)表示lx取值范围为[…

linux swap分区与内存,虚拟内存和swap分区的关系

首先,这两个概念分别对应windows和linux,即:windows:虚拟内存linux:swap分区windows即使物理内存没有用完也会去用到虚拟内存,而Linux不一样 Linux只有当物理内存用完的时候才会去动用虚拟内存(即swap分区)…