进程调度初始化

由于该过程涉及到进程的管理模块,这个模块的详细过程我们将在以后的机会介绍,所以这里,我们主要扣出与调度相关的内容。进程的创建内核入口为do_fork,首先我们简单的看一下它的主要行为:


图 do_fork与CFS的交互

上图我们只是画了do_fork最普通的fork操作,及正常的启动状态,上面的三个sched_class函数调用就是我们想要的进程调度初始化。我们分别来分析:
task_fork_fair:确定新进程的vruntime值。首先更新当前进程(父进程)的执行信息(update_curr),确定新进程的起始vruntime(place_entity),如果新的进程被设置了sysctl_sched_child_runs_first,并且父进程的vruntime大于子进程的,那么就交换它们的vruntime值,并且设置父进程的TIF_NEED_RESCHED,让它在下次主调度中结束运行,让其它更低vruntime的先运行(不能保证一定是它的子进程先运行,但在它退出运行后,它的子进程一定会比它先运行),然后标准化vruntime,因为现在的子进程还没有入队。

enqueue_task_fair:将子进程放入运行队列中。注意此时传入的flag=0,因为上面把vruntime标准化了,所以现在入队需要把它再反标准化(在CFS内部使用的是非标准化的vruntime,但在红黑树里存储的是标准化的值)。所以对于组调度来说,它需要先把它开始往上的不在运行队列里的se都进行入队操作,(enqueue_entity该函数需要注意的是:如果要入队的se是被ENQUEUE_WAKEUP,那么它的vruntime要进行调整补偿place_entity,显然这里不是被wakeup的),并且更新cfs_rq的load,se->on_rq = 1, cfs_rq->h_nr_running++;对于已经在队列里的groupse只需要更新h_nr_running就可以了,所以再递归到group root更新这个变量就可以了。

check_preempt_wakeup:检查子进程是否应该抢占当前父进程。显然如果在task_fork_fair我们已经确定了子进程将抢占父进程,那么这里就直接返回;如果当前进程是idle进程(该函数不一定只检查父子进程之间的抢占与否,只是在现在的场景是这样的),那么它应该无条件被抢占,更新当前进程的执行时间,在确定是否要抢占前必须保证比较的两个se处于同一group之下(find_matching_se,即找到它们第一次分开的祖先为止,只有处理同一个层次它们才有可比较性),然后再判断这两个同级的se(可能是之前两个se的祖先),旧的se是否可以被新的se抢占(wakeup_preempt_entity),如果允许的话,更新set_next_buddy,这样在pick_next_entity时它就可以优先被获得;最后就是调用resched_task设置当前进程的TIF_NEED_RESCHED,以及更新set_last_buddy(这个的作用同样见pick_next_entity)。

我们总结一下上面的过程,父进程在执行copy_process时通过task_fork_fair确定子进程的vruntime,同时可能确定子进程是否该抢占父进程;创建完子进程结构及确定vruntime后就可以把子进程入放运行队列enqueue_task_fair,该过程就对组调度上的信息进程更新及入队而已;最后再次确定子进程是否该抢占父进程,并且更新buddy,以保证在pick的时候能够取到最合适的进程。这样我们就把进程fork时调度器为它完成的工作介绍完成。下面我们再考虑进程从不可运行状态唤醒到可运行状态调度器的处理逻辑。

进程唤醒调度过程

我们知道linux的唤醒入口在try_to_wake_up,通过查看该函数,我们可以发现它大多数在处理SMP的情况,对于非SMP的话,其实很简单,如果要被唤醒的进程已经在运行队列里,那么直接检查它是否可以抢占当前进程(check_preempt_curr),否则先把进程加入运行队列中activate_task,再check_preempt_curr。注意这里的activate_task及标志不再是do_fork时的0,而是ENQUEUE_WAKEUP,这样在CFS enqueue_entity时就会调用place_entity对睡眠进程进行vruntime补偿。

上面我们把CFS与调度相关的内容简单的介绍了,但我们并没有详细分析到每个函数里,如果要了解这些细节的话,可以看后面的 OTHER CFS CLASS API 及 CFS主要的内部函数 。下面我们再在应用层上来理解和观察CFS组调度的分配

linux调度器(五)——进程管理与CFS相关推荐

  1. Linux 调度器发展简述

    引言 进程调度是操作系统的核心功能.调度器只是是调度过程中的一部分,进程调度是非常复杂的过程,需要多个系统协同工作完成.本文所关注的仅为调度器,它的主要工作是在所有 RUNNING 进程中选择最合适的 ...

  2. 【Linux 内核】CFS 调度器 ③ ( 计算进程 “ 虚拟运行时间 “ )

    文章目录 一.计算进程 " 虚拟运行时间 " 一.计算进程 " 虚拟运行时间 " 在上一篇博客 [Linux 内核]CFS 调度器 ② ( CFS 调度器 &q ...

  3. Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)

    日期 内核版本 架构 作者 GitHub CSDN 2016-06-30 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 ...

  4. Linux调度器及CFS调度器

    Linux调度器及CFS调度器 调度器 调度器类sched_class结构体 进程的优先级 调度策略 CFS调度器 实际运行时间 虚拟运行时间 调度器结构分析 调度器 ​ 调度:就算按照某种调度的算法 ...

  5. 深入理解Linux 进程管理之CFS负载均衡

    什么是负载均衡? 为了CPU之间减少"干扰",每个CPU上都有一个任务队列.运行的过程种可能会出现有的CPU"忙的一笔",有的CPU"闲的蛋疼&quo ...

  6. Linux调度器笔记

    相关资料 <linux 调度子系统>这个博客讲的非常好 <linux调度器源码分析 - 概述(一)>讲的也挺好,有源码分析. SCHED_FIFO等调度策略的定义和设置可以参考 ...

  7. 能感知功耗的Linux调度器(EAS)

    译者简介 白嘉庆,西邮陈莉君教授门下研一学生.曾在华为西安研究所任C++开发一职,目前兴趣是学习Linux内核网络安全相关内容. 本文的翻译宋宝华老师指导审阅. 序 2014年Linux内核峰会(Li ...

  8. Linux 调度器内幕

    内核中这个非常重要的组件的最新版本改进了可伸缩性 M. Jones 2006 年 9 月 07 日发布 WeiboGoogle+用电子邮件发送本页面 2 本文将回顾一下 Linux 2.6 的任务调度 ...

  9. linux 进程管理 ppt,Linux内核结构与进程管理.ppt

    Linux内核结构与进程管理.ppt Linux 内核结构与进程管理,Linux系统结构Linux kernel 开放源代码的linux操作系统内核,目前版本为2.6,Linux内核组成1. 进程调度 ...

  10. 操作系统实验一 Linux基本操作|实验二 进程管理

    由于当时没存代码,只有实验文档代码截图,文末也可直接获取实验文档. 操作系统实验 目录 实验一 Linux基本操作 实验二进程管理 实验一 Linux基本操作 1实验目的 1.熟悉在Linux操作系统 ...

最新文章

  1. Java面试之Java基础上册(含答案)
  2. 自学成才翁_如何发挥自学成才的内在游戏
  3. 每日 30 秒 ⏱ 无障碍世界
  4. 【.NET深呼吸】基础:自定义类型转换
  5. 排序算法时间复杂度和稳定性
  6. mysql 重建注册_mysql 重建帐号
  7. iOS实现一个颜色渐变的弧形进度条
  8. 苹果Mac 软件出现「意外退出」及「打不开」解决方法
  9. 在url中传递参数(方法二)
  10. 18.10 汇编语句
  11. QTP 10.0 破解版下载安装超详细教程
  12. Java数组 排序算法和常见异常
  13. 工作流初始错误 泛微提交流程提示_泛微协同办公平台E-cology8.0版本后台维护手册(11)–系统参数设置...
  14. 传统企业连接互联网的五种方式
  15. NLP:不要重新造轮子
  16. 2023新疆大学计算机考研信息汇总
  17. 网络型PLC可编程控制器实验装置(立式、挂箱积木式)
  18. 2022年最新文本生成图像研究 开源工作速览(Papers with code)
  19. sql server的缺陷 将截断字符串或二进制数据 哪个字段
  20. (淘宝无限适配)手机端rem布局详解

热门文章

  1. Android心得1.5--第一次搭建Android环境的心得和第一个应用程序部分代码解析
  2. python 车牌识别训练模型_使用Python基于HyperLPR/Mask-RCNN的中文车牌识别
  3. Centos6.7安装Apache2.4+Mysql5.6+Apache2.4
  4. springmvc 接收对象 滴灌摘要
  5. Jackson2 json 转换Bean, Bean 里没有对应的值 jackson Un的解决方式
  6. SQL Server MYSQL 检查点的好处
  7. matlab2014 下的 libsvm 安装
  8. 利用vue-gird-layout 制作可定制桌面 (一)
  9. SAP OLE中常用的一些方法和属性
  10. redis,memcache二者的区别