进程调度初始化

由于该过程涉及到进程的管理模块,这个模块的详细过程我们将在以后的机会介绍,所以这里,我们主要扣出与调度相关的内容。进程的创建内核入口为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. 任命新CFO 百度迎来首位女性高管
  2. MySQL root密码找回
  3. boost::contract模块实现dictionary字典的测试程序
  4. LeetCode MySQL 1495. Friendly Movies Streamed Last Month
  5. SwiftTour基础学习(五)控制流
  6. phpexcel 打开时 excel无法识别此文件格式
  7. Eclipse集成Git插件及使用
  8. (转)《Billions》第二季回归,现实中的SAC也回来了
  9. python计算标准差为什么分母要-1_为什么样本方差(sample variance)的分母是 n-1?...
  10. Linux---ALSA音频工具arecord、aplay、amixer使用
  11. 单片机课设———基于51单片机的智能风扇控制器(汇编语言)
  12. 第四次实验(全连MGRE、星型拓扑、OSPF通私有网段)
  13. 服务器异常的处理方式
  14. php源码 拼车网顺风车_最新拼车网PHP源码整站打包—微信拼车+手机拼车+微信双终端+数据同步...
  15. axure9总是崩_axure老是崩怎么办
  16. linux trace 进程 文件路径,linux panic 问题定位
  17. ZAM 3D 制作简单的3D字幕 流程(二)
  18. 点触科技安全验证新模式与逐浪CMS3.9.3新功能预览
  19. org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused: connec
  20. 日本开设无人机专业,打造无人机“人才市场”

热门文章

  1. 第一回合:.net与 C#基本概念
  2. word域高级应用 if 域 域邮件合并的值的更改 日期的更改
  3. JavaScript链式调用,对象属性与遍历,this指向,callee和caller
  4. Xcode8报错:No code signature found
  5. [CareerCup] 12.6 Test an ATM 测试一个自动取款机
  6. 在Windows上安装虚拟机详细图文教程
  7. wireless 时好时断的一些解决的建议
  8. 从现有数据创建 XML 架构和数据集
  9. 29.FFmpeg+OpenGLES+OpenSLES播放器实现(三.FFmpeg配置和编译脚本)
  10. java程序员学习路线图 java程序员进阶路线