深入解读Linux进程调度系列(3)——调度的执行过程
日期 | 内核版本 | CPU架构 | 作者 |
2019.04.06 | Linux-5.0 | PowerPC | LoneHugo |
系列文章:https://blog.csdn.net/Vince_/article/details/89054330
1. schedule()接口
首先需要关闭抢占,防止调度重入,然后调用__schedule,进行current相关的处理,比如有待决信号,则继续标记状态为TASK_RUNNING,或者如果需要睡眠则调用deactivate_task将从运行队列移除后加入对应的等待队列,通过pick_next_task选择下一个需要执行的进程,进行context_switch进入新进程运行。
2. pick_next_task
首先判断当前进程调度类sched_class是否为fair_sched_calss,也就是CFS,如果是且当前cpu的调度队列下所有调度实体数目与其下面所有CFS调度类的下属群组内的调度实体数目总数相同,即无RT等其他调度类中有调度实体存在(rq->nr_running == rq->cfs.h_nr_running),则直接返回当前调度类fair_sched_class的pick_next_task选择结果,否则需要遍历所有调度类for_each_class(class),返回class->pick_next_task的非空结果。
这里需要关注的是for_each_class的遍历过程,从sched_class_highest开始,也就是stop_sched_class。
#define sched_class_highest (&stop_sched_class)
#define for_each_class(class) \for (class = sched_class_highest; class; class = class->next)extern const struct sched_class stop_sched_class;
extern const struct sched_class dl_sched_class;
extern const struct sched_class rt_sched_class;
extern const struct sched_class fair_sched_class;
extern const struct sched_class idle_sched_class;
3. 各个调度类的关联
按照优先级依次罗列组成单链表:
stop_sched_class->next->dl_sched_class->next->rt_sched_class->next->fair_sched_class->next->idle_sched_class->next=MULL
4. 调度类的注册
在编译过程中通过early_initcall(cpu_stop_init)进行stop相关的注册,cpu_stop_init对cpu_stop_threads进行了注册,其create方法被调用时实际执行了cpu_stop_create->sched_set_stop_task,对stop的sched_class进行注册,create的执行路径如下:
cpu_stop_init->smpboot_register_percpu_thread->smpboot_register_percpu_thread_cpumask->__smpboot_create_thread->cpu_stop_threads.create(即cpu_stop_create)
现在回到pick_next_task,由于stop_sched_class作为最高级别调度类将所有系统中的调度类链接起来,遍历过程查看所有sched_class,从最高优先级开始,直到找到一个可以调度的进程返回,如果整个系统空闲,则之中会调度到系统初始化进程init_task,其最后被设置为idle进程在系统空闲时的调度执行,上面对sched_init的解释里面有详细说明。
组调度相关内容:http://oenhan.com/task-group-sched
深入解读Linux进程调度系列(3)——调度的执行过程相关推荐
- linux 如何运行函数,Linux系统中main函数的执行过程
1. 问题:Linux如何执行main函数. 本文使用一个简单的C程序(simple.c)作为例子讲解.代码如下, intmain() { return(0); } 2. 编译 -#gcc -o s ...
- MySql系列之mysql查询执行过程(附Mysql架构图及实操解析)
一 MySql架构图 1.2 执行步骤: 1.客户端发送查询语句给服务器 2 服务器首先检查缓存中 是否存在该查询,若存在,返回缓存中存在的结果 不存在 执行下一步 3服务器进行sql解析 语法检测 ...
- 瞎说系列——Mysql update的执行过程
要了解mysql update语句的执行过程,首先要了解一下mysql是如何进行数据的操作的. 首先,数据库中的数据存在哪?肯定是文件系统,磁盘上对吧.那么思考一下,每次查询都从磁盘上去查找吗? 答案 ...
- Linux进程管理与调度-之-目录导航【转】
转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:// ...
- linux操作的进程调度没有采用,Linux进程调度分析
Computer Knowledge and Technology 电脑知识 与技术本栏目责任编辑:冯蕾 网络通讯及安全第7卷第1期(2011年1月)Linux 进程调度分析 钟诚,卢卫恒,李德勇 ( ...
- Redis事件-文件事件、时间事件、事件调度与执行
文件事件.时间事件.事件调度与执行 概述 文件事件 文件事件处理器的构成(重要!!!) 事件类型(读事件 和 写事件) 文件事件相关API I/O多路复用程序的实现(重要!!!) 文件事件处理器(重要 ...
- (6)Linux进程调度-实时调度器
目录 背景 1. 概述 2. 数据结构 3. 流程分析 3.1 运行时统计数据 3.2 组调度 3.3 带宽控制 3.4 调度器函数分析 3.4.1 pick_next_task_rt 3.4.2 e ...
- Linux进程调度 - 实时调度器 LoyenWang
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- linux每隔多久调度y,Linux 进程调度+Linux系统一般执行过程 笔记
进程的调度时机与进程的切换 操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程,选择的过程中运用了不同的策略而已. 对于理解操作系统的工作机制,反而是进程的调 ...
- linux 2.6内核进程调度,Linux2.6内核进程调度系列--scheduler_tick()函数2.更新实时进程的时间片,...
Linux2.6内核进程调度系列--scheduler_tick()函数2.更新实时进程的时间片, RT /** * 递减当前进程的时间片计数器,并检查是否已经用完时间片. * 由于进程的调度类型不同 ...
最新文章
- 回首2018 | 分析型数据库AnalyticDB:不忘初心 砥砺前行...
- [zz]jQuery.extend 函数详解
- 判断点是否处于多边形内的三种方法(转)
- 云开发0基础训练营第二期热力来袭!
- “智享未来 知行合一”,开为科技助力企业开启人工智能新时代
- 虚拟环境使用自动化软件能够节省成本吗?
- ai技术领先的企业_领先企业如何扩展AI
- SpringBoot整合shiro框架(张开涛跟我学shiro-综合实例-代码新版)
- matlab加分号,matlab加分号
- Echarts使用之-散点图(各国人均寿命与GDP关系演变)
- JS仿写刮刮乐小例子
- 【PHP基础-3】PHP常用运算符
- 关于注册校验和密钥生成软件问题
- 【无标题】电商SaaS之觞
- 一次迭代式开发的研究:一个迭代式项目计划
- 知因智慧任亮:用知识图谱构建清晰的“产业世界”,做中国最大的产业链金融AI赋能运营商丨Xtecher 封面
- 普元信息 服务器,普元配置服务器
- 浏览器页面性能分析指南(chrome)
- 《数据结构与算法》(十一)- 树、森林与二叉树的转换及哈夫曼树详解
- rdma-轮询常用cq函数。