日期 内核版本 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)——调度的执行过程相关推荐

  1. linux 如何运行函数,Linux系统中main函数的执行过程

    1. 问题:Linux如何执行main函数. 本文使用一个简单的C程序(simple.c)作为例子讲解.代码如下, intmain() { return(0); } 2.  编译 -#gcc -o s ...

  2. MySql系列之mysql查询执行过程(附Mysql架构图及实操解析)

    一 MySql架构图 1.2 执行步骤: 1.客户端发送查询语句给服务器 2 服务器首先检查缓存中 是否存在该查询,若存在,返回缓存中存在的结果 不存在 执行下一步 3服务器进行sql解析 语法检测 ...

  3. 瞎说系列——Mysql update的执行过程

    要了解mysql update语句的执行过程,首先要了解一下mysql是如何进行数据的操作的. 首先,数据库中的数据存在哪?肯定是文件系统,磁盘上对吧.那么思考一下,每次查询都从磁盘上去查找吗? 答案 ...

  4. Linux进程管理与调度-之-目录导航【转】

    转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:// ...

  5. linux操作的进程调度没有采用,Linux进程调度分析

    Computer Knowledge and Technology 电脑知识 与技术本栏目责任编辑:冯蕾 网络通讯及安全第7卷第1期(2011年1月)Linux 进程调度分析 钟诚,卢卫恒,李德勇 ( ...

  6. Redis事件-文件事件、时间事件、事件调度与执行

    文件事件.时间事件.事件调度与执行 概述 文件事件 文件事件处理器的构成(重要!!!) 事件类型(读事件 和 写事件) 文件事件相关API I/O多路复用程序的实现(重要!!!) 文件事件处理器(重要 ...

  7. (6)Linux进程调度-实时调度器

    目录 背景 1. 概述 2. 数据结构 3. 流程分析 3.1 运行时统计数据 3.2 组调度 3.3 带宽控制 3.4 调度器函数分析 3.4.1 pick_next_task_rt 3.4.2 e ...

  8. Linux进程调度 - 实时调度器 LoyenWang

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  9. linux每隔多久调度y,Linux 进程调度+Linux系统一般执行过程 笔记

    进程的调度时机与进程的切换 操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程,选择的过程中运用了不同的策略而已. 对于理解操作系统的工作机制,反而是进程的调 ...

  10. linux 2.6内核进程调度,Linux2.6内核进程调度系列--scheduler_tick()函数2.更新实时进程的时间片,...

    Linux2.6内核进程调度系列--scheduler_tick()函数2.更新实时进程的时间片, RT /** * 递减当前进程的时间片计数器,并检查是否已经用完时间片. * 由于进程的调度类型不同 ...

最新文章

  1. 回首2018 | 分析型数据库AnalyticDB:不忘初心 砥砺前行...
  2. [zz]jQuery.extend 函数详解
  3. 判断点是否处于多边形内的三种方法(转)
  4. 云开发0基础训练营第二期热力来袭!
  5. “智享未来 知行合一”,开为科技助力企业开启人工智能新时代
  6. 虚拟环境使用自动化软件能够节省成本吗?
  7. ai技术领先的企业_领先企业如何扩展AI
  8. SpringBoot整合shiro框架(张开涛跟我学shiro-综合实例-代码新版)
  9. matlab加分号,matlab加分号
  10. Echarts使用之-散点图(各国人均寿命与GDP关系演变)
  11. JS仿写刮刮乐小例子
  12. 【PHP基础-3】PHP常用运算符
  13. 关于注册校验和密钥生成软件问题
  14. 【无标题】电商SaaS之觞
  15. 一次迭代式开发的研究:一个迭代式项目计划
  16. 知因智慧任亮:用知识图谱构建清晰的“产业世界”,做中国最大的产业链金融AI赋能运营商丨Xtecher 封面
  17. 普元信息 服务器,普元配置服务器
  18. 浏览器页面性能分析指南(chrome)
  19. 《数据结构与算法》(十一)- 树、森林与二叉树的转换及哈夫曼树详解
  20. rdma-轮询常用cq函数。

热门文章

  1. 两个时间相减(vb.net)
  2. 剧情介绍:“造雨人”
  3. simulink和psim仿真结果不同_Abaqus软件掌握大部件焊接仿真的解决思路
  4. 拥有2000家门店,他如何晋升为服装界的新宠? 1
  5. Linux---文件权限的控制
  6. [Network] okhttp3与旧版本okhttp的区别分析
  7. Xcode8报错:No code signature found
  8. C#中取得汉语拼音首字母
  9. zookeeper 环境搭建之(Windows上的简单部署)
  10. 终于忙完了,要开启代码生涯了