进程管理-调度器 sched_class 结构体-fair_sched_class rt_sched_class 对象及优先级

调度器 sched_class 结构体

调度器 需要做的动作都抽象出来,放在 接口 sched_class 里面,结构体定义在 linux/kernel/sched/sched.h

里面都是 函数指针, 定义了各种调度操作。

示例:

enqueue_task  -  将 task * p 加入到 rq 里面;

需要  根据这儿的函数原型,实现函数,然后将函数指针填入到 sched_class 定义的对象里面。

kernel 中定义了 5 个 sched_class 的对象; stop_sched_class ; dl_sched_class ; rt_sched_class ; fair_sched_class ; idle_sched_class ;

1779struct sched_class {

1785        void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags);
1786        void (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags);
1787        void (*yield_task)   (struct rq *rq);
1788        bool (*yield_to_task)(struct rq *rq, struct task_struct *p);
1789
1790        void (*check_preempt_curr)(struct rq *rq, struct task_struct *p, int flags);
1791
1792        struct task_struct *(*pick_next_task)(struct rq *rq);
1793
1794        void (*put_prev_task)(struct rq *rq, struct task_struct *p);
1795        void (*set_next_task)(struct rq *rq, struct task_struct *p, bool first);
1796
1797#ifdef CONFIG_SMP
1798        int (*balance)(struct rq *rq, struct task_struct *prev, struct rq_flags *rf);
1799        int  (*select_task_rq)(struct task_struct *p, int task_cpu, int sd_flag, int flags);
1800        void (*migrate_task_rq)(struct task_struct *p, int new_cpu);
1801
1802        void (*task_woken)(struct rq *this_rq, struct task_struct *task);
1803
1804        void (*set_cpus_allowed)(struct task_struct *p,
1805                                 const struct cpumask *newmask);
1806
1807        void (*rq_online)(struct rq *rq);
1808        void (*rq_offline)(struct rq *rq);
1809#endif
1810
1811        void (*task_tick)(struct rq *rq, struct task_struct *p, int queued);
1812        void (*task_fork)(struct task_struct *p);
1813        void (*task_dead)(struct task_struct *p);
1814
1815        /*
1816         * The switched_from() call is allowed to drop rq->lock, therefore we
1817         * cannot assume the switched_from/switched_to pair is serliazed by
1818         * rq->lock. They are however serialized by p->pi_lock.
1819         */
1820        void (*switched_from)(struct rq *this_rq, struct task_struct *task);
1821        void (*switched_to)  (struct rq *this_rq, struct task_struct *task);
1822        void (*prio_changed) (struct rq *this_rq, struct task_struct *task,
1823                              int oldprio);
1824
1825        unsigned int (*get_rr_interval)(struct rq *rq,
1826                                        struct task_struct *task);
1827
1828        void (*update_curr)(struct rq *rq);
1829
1830#define TASK_SET_GROUP          0
1831#define TASK_MOVE_GROUP         1
1832
1833#ifdef CONFIG_FAIR_GROUP_SCHED
1834        void (*task_change_group)(struct task_struct *p, int type);
1835#endif
1836} __aligned(STRUCT_ALIGNMENT); /* STRUCT_ALIGN(), vmlinux.lds.h */
1837

stop_sched_class ; dl_sched_class ; rt_sched_class ; fair_sched_class ; idle_sched_class优先级

声明在:   linux/kernel/sched/sched.h 中; 1863 ~1867 行

1850/* Defined in include/asm-generic/vmlinux.lds.h */
1851extern struct sched_class __begin_sched_classes[];
1852extern struct sched_class __end_sched_classes[];
1853
1854#define sched_class_highest (__end_sched_classes - 1)
1855#define sched_class_lowest  (__begin_sched_classes - 1)
1856
1857#define for_class_range(class, _from, _to) \
1858        for (class = (_from); class != (_to); class--)
1859
1860#define for_each_class(class) \
1861        for_class_range(class, sched_class_highest, sched_class_lowest)
1862
1863extern const struct sched_class stop_sched_class;
1864extern const struct sched_class dl_sched_class;
1865extern const struct sched_class rt_sched_class;
1866extern const struct sched_class fair_sched_class;
1867extern const struct sched_class idle_sched_class;
1868

1851 ~ 1855 通过 链接 脚本中的  __begin_sched_class ;  __end_sched_class

得到优先级最高的 调度器 sched_class_highest ; 优先级最低的调度去 sched_class_lowest 

1860 的 for each sched class 就是从 highest 来时遍历的

kernel/sched/core.c 中,查找下一个 将要运行task 的函数, pick_next_task

4362 ~ 4364 - 从 highest sched class 找的,找到就返回,找不到才使用 低优先级的 sched class 

4327/*
4328 * Pick up the highest-prio task:
4329 */
4330static inline struct task_struct *
4331pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
4332{

4361        for_each_class(class) {
4362                p = class->pick_next_task(rq);
4363                if (p)
4364                        return p;
4365        }

4369}

include\asm-generic\vmlinux.lds.h 中对 各个调度器 对象 进行了排序

127 */
 128#define SCHED_DATA                              \
 129        STRUCT_ALIGN();                         \
 130        __begin_sched_classes = .;              \
 131        *(__idle_sched_class)                   \
 132        *(__fair_sched_class)                   \
 133        *(__rt_sched_class)                     \
 134        *(__dl_sched_class)                     \
 135        *(__stop_sched_class)                   \
 136        __end_sched_classes = .;

以 fair_sched_class 为例: 定义在 kernel/sched/fair.c#L254 

注意,里面的  __section 说明,将这个结构体都放在了  __fait_sched_class 这个 section 里面; 上面的 vmlinux.lds.h 中才使用这个 section 

11179/*
11180 * All the scheduling class methods:
11181 */
11182const struct sched_class fair_sched_class
11183        __section("__fair_sched_class") = {
11184        .enqueue_task           = enqueue_task_fair,
11185        .dequeue_task           = dequeue_task_fair,
11186        .yield_task             = yield_task_fair,
11187        .yield_to_task          = yield_to_task_fair,
11188
11189        .check_preempt_curr     = check_preempt_wakeup,
11190
11191        .pick_next_task         = __pick_next_task_fair,
11192        .put_prev_task          = put_prev_task_fair,
11193        .set_next_task          = set_next_task_fair,

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

红队工具Finger 安装具体以步骤-示例centos

1.git clone https://github.com/EASY233/Finger.git 如果没有 yum install git 2.pip3 install -r requirements.txt 找到finger所在的文件夹 可以用find -name "Finger"进入文件中配置命令 前提要安装python yum install python-pip33.python3 Finger.py -h

Databend 开源周报第 151 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend。 支持递归调用 UD…

浅谈k8s中cni0和docker0的关系和区别

最近在复习k8s网络方面的知识,查看之前学习时整理的笔记和文档还有过往自己总结的博客之后发现一个问题,就是在有关flannel和calico这两个k8s网络插件的文章和博客中,会涉及到cni0和docker0这两个网桥设备,但是都没有明确说明他们…

新华三通用大模型算力底座方案:为AI时代注入强大动力

在人工智能技术日新月异的今天,大模型作为推动AI进步的重要驱动力,是百行百业不断追逐的热点。大模型以其强大的泛化能力、卓越的模型效果和广泛的应用场景,正改变着人工智能的未来。作为国内领先的ICT解决方案提供商,新华三集团凭…

【刷题汇总--牛牛的快递、最小花费爬楼梯、数组中两个字符串的最小距离】

C日常刷题积累 今日刷题汇总 - day0021、牛牛的快递1.1、题目1.2、思路1.3、程序实现1.4、程序实现(扩展) 2、最小花费爬楼梯2.1、题目2.2、思路2.3、程序实现 3、数组中两个字符串的最小距离3.1、题目3.2、思路3.3、程序实现3.4、补充0x3f3f3f3f 4、题目链接 今日刷题汇总 - d…

解码未来城市:探秘数字孪生的奥秘

在科技日新月异的今天,"数字孪生"(Digital Twin)这一概念如同一颗璀璨的新星,照亮了智慧城市、智能制造等多个领域的前行之路。本文将深入浅出地解析数字孪生的定义、技术原理、应用场景及未来发展,带您一窥…

亚马逊TM商标跟卖,同行截流采集,人工手动跟卖选品更方便!

区分TM标,软件自动查询,人工手动查询方便。 大家好,跟大家说下如何区分TM标。 选择相对于的站点,选择TM。 软件采集出来的已备案、未备案TMR标,现在点击TM标就会跳到美国商标局。 可以清晰的看到这个地方只有一个序…

电力授时设备常用:低功耗定位授时模块ATGM332D-5T

ATGM332D有5N微星定位模块系列和5T授时模块,其中我们今天要解读的是一款拥有高性能、低功耗、低成本优势且适用于各类授时设备并支持BDS/GNSS的定位授时模块ATGM332D-5T。 该系列模块产品是基于中科微第四代低功耗GNSS SOC单芯片—AT6558,支持多种微星导…

【实战】EasyExcel实现百万级数据导入导出

文章目录 前言技术积累实战演示实现思路模拟代码测试结果 前言 最近接到一个百万级excel数据导入导出的需求,大概就是我们在进行公众号API群发的时候,需要支持500w以上的openid进行群发,并且可以提供发送openid数据的导出功能。可能有的同学…

《昇思25天学习打卡营第1天|基本介绍》

文章目录 前言:今日所学:昇思MindSpore相关链接: 前言: 今天非常荣幸的收到了昇思25天学习打卡营的邀请。昇思MindSpore作为华为昇腾AI全栈的重要一员,他支持端、边、云独立的和协同的统一训练和推理框架,…

电脑录歌用什么软件好?分享电脑录音软件:6款

短视频普遍的今天,越来越多的人喜欢通过电脑进行音乐创作和录制。然而,面对市面上琳琅满目的电脑录音软件,很多人可能会感到困惑:电脑录歌用什么软件好呢?本文将为大家分享六款精选的录音软件,帮助大家找到…

某网页gpt的JS逆向

原网页网址 (base64) 在线解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei8 逆向效果图 调用代码(复制即用) 把倒数第三行换成下面的base64解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei9hcGkvZ2VuZXJhdGU import hashlib import time import reques…

git提交实战

以新项目为例,如何在新项目新分支提交代码。 1.查看文件所在位置 git init 2.克隆项目到本地并完成身份配置 3.将需要新增的文件放到指定目录路径下 4.进入新克隆的文件 cd XXX 5.切换分支 git checkout XXX 6.标红者即为新提交的文件 git status 7.加入 git …

AI图生视频工具测试

环境: 即梦 pika LUMA 可灵 问题描述: AI图生视频工具测试下面是原图 解决方案: 1.即梦 效果 2.pika 生成效果 3.LUMA 生成效果还行 4.可灵 生成效果最好

AI模特换装试衣软件定制服务公司

🌟 最强AI模特换装试衣模型训练、定制服务公司出炉 —— 触站AI🚀 🎨 在AI技术的浪潮中,触站AI以其专业和创新,成为企业AI图像领域的技术解决方案服务公司,为设计界带来了革命性的变化。 🛠️ …

Hadoop3:Yarn的Tool接口案例

一、需求 依然以wordcount案例为基础,进行开发 我们知道,用hadoop自带的example.jar执行wordcount 命令如下 hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -D mapreduce.job.queuename…

线性代数--行列式1

本篇来自对线性代数第一篇的行列式的一个总结。 主要是行列式中有些关键点和注意事项,便于之后的考研复习使用。 首先,对于普通的二阶和三阶行列式,我们可以直接对其进行拆开,展开。 而对于n阶行列式 其行列式的值等于它的任意…

【Linux进程通信】使用匿名管道制作一个简单的进程池

进程池是什么呢?我们可以类比内存池的概念来理解进程池。 内存池 内存池是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继…

昇思25天学习打卡营第9天|FCN图像语义分割

FCN是Fully Convolutional Networks的简称,即全卷积网络。区别于全连接网络,全连接网络每层直接cell全部连接,全卷积网络即每层都进行卷积。全卷积网络不包含全连接层。 卷积说有点像缩放,具体的可以参考其他专门的介绍文章。 之…

WPF UI 3D 多轴 机械臂 stl 模型UI交互

鼠标交互(没有强调场景的变换) 鼠标命中测试(HitTest 不推荐) 平面对象加载 数据绑定(数据与动作) 环境配置与相关方法 模型准备:Blender/SolidWorks 模型导入 HelixToolkit更多案例…