本文分为概述、历史、el7.2代码架构图解三部分。
解决的问题:
a.Kernel调度发展过程;
b.以架构图的方式,详解el7.2具体调度实现、内核线程模型、调度时间片计算,以及探究整个Kernel实际运行过程。
1.概述
现代操作系统,通过虚拟化CPU及内存,来达到最大化硬件能力的目的
a.内存虚拟化:
每个task都有自己独立的虚拟内存地址空间,然后映射到physical memory;实际内存总量是一定的,为了使多个程序同时、正常的运行起来,每个task虚拟内存都从0x0000开始,当程序被载入内存中时,才在物理内存管理表中,建立虚拟内存和物理内存的关系,task运行时实际是CPU在物理内存上进行指令运算、存取。
好比桌子上有一堆huge水果,但是你只有一个small篮子,为了让每个huge水果被食用时,都是通过篮子装载的,只有在食用时,才从桌子上把huge水果放到篮子的固定位置,提供给你食用。
b.CPU虚拟化:
每个task并不是一直独占CPU,而是将CPU按照时钟频率进行划分,通常HZ为1000,每个获取执行权限的task执行一个时序,而从在秒级层面看来,本时间段中,有多个task获得执行,达到模拟并行的效果。
这个过程和现实中人做事情一样,每一个固定时间段,精力集中在一件事上,但是一整天,咱并行做了很多任务。
CPU调度的难点在于必须使高、低优先级的task都得到执行,并且交互式task必须在50-150ms中得到执行。
2.历史
a.0.01版
最初的调度系统中,只有一个处理队列,并且循环不断的从其中取出要执行的task。
在那个年代,最多能执行的task总数为NR_TASKS=32;并且从那时起就引入了执行task状态RUNNING、INTERRUPTIBLE、UNINTERRUPTIBLE的概念;同时,提出了按照优先级和时间片来决定next exec task,这一schedule核心的思想,贯穿了整个Kernel的发展。
b.O(n) Scheduler in Version 2.4
简单粗暴的将系统的一段时间划分给系统上所有task,以保证在这段时间(lifetime生命周期)内所有进程得到执行;
在这段时间末尾,有些task的timeslice未用完,则将其值的一半加到下一个时间段中
其显著缺点是耗费太多时间在选择要执行的task上,并且对real-time task支持不好
c.O(1) in early versionf of 2.6 kernel
由于其显著的选择goodness task速度及对real-time的支持,很快便取代了O(n) Scheduler
i.从全局进行priority规划,0-139共140个等级,数字越小,优先级越高;同时,对real-time和normal task的等级区间进行了规划,即0-99作为real-time task专用区间,100-139作为normal task区间;
ii.CPU抢占思想的提出,当有task进入TASK_RUNNING时,并根据其与当前task优先级大小(current——调度系统中指向当前执行进程的宏,非常重要),决定是否调用schedule()——调用此方法,会重新选择执行task,以达到高优先级抢占低优先级task CPU的目的;
iii.根据task的交互程度动态调整task优先级;
iv.为real-time设计了静态优先级。
设计:
i.为避免每次选择执行task时,遍历所有task,这里使用两个数组来装载task——active and expired array(list),从active array中取出task进行执行,task耗尽分配的时间后,放入expired array。
ii.将active及expired array按照140个优先级进行划分,这样每个active或expired数组都是二维数组——含有140个元素,每个元素都是一个list;并且持有一个bitmap,用来标识140个list中,哪个list有task
经此设计,每次schedule()先查bitmap,从低位开始,从有task的list中取出task来执行,而优先级一致的task按序执行即可,从而实现了O(1)的调度速度。
iii.使用task's sleep time来标记交互式task,active array根据sleep time进行排序,这块非常复杂,且容易异常情况态度,会导致各种各样问题。
d.内核调度分支——The Staircase Scheduler
核心思想是在c的基础上,高优先级task执行一次后,其优先级减1,并放入对应array中,等待下次执行。
e.Default Scheduler CFS——Completely Fair Scheduler For Normal Task
提出了根据不同类型task使用不同的调度策略的思想,real-time task使用“kernel-3.10.0-327.el7/linux-3.10.0-327.el7.centos.x86_64/kernel/sched/rt.c”进行调度,而normal task则使用fair.c进行调度;fair.c即是CFS的实现,针对的是normal task的调度,其思想是"根据one normal task's weight占total normal task weight总和百分比来决定CPU使用率,达到了理想的高度精确的多任务调度:
i.重新设计的优先级,引入nice的概念,范围为[-20,19],值越小,获得CPU使用率越大;
ii.理想的按nice数值控制的CPU使用率,即nice每上升1,则少获取10%CPU;为达到精确控制,设计了prio_to_weight数组(见下图),只有两个nice为0的进程为,每个进程CPU使用率占比都为1024/(1024+1024);只有一个nice为0与1的进程是,nice为0进程CPU使用率为1024/(1024+820)=0.55,nice为1进程CPU使用率为0.45,两者的CPU使用率相差10%,
(1).jpg)
iii.使用Red-Black Tree来存取task,每次调度时间复杂度为O(lgN)
iv.内核层面的优先级仍然为0-140,0-99为real-time task,100-139为normal task,向上兼容real-time task的调度,通过将nice值加上120(120=real-time task优先级个数100+nice值个数40的一半)得到priority,而priority减去120得到nice
v.同时引入按组调度的概念,整体CPU使用率按组进行划分(如只有GroupA与B时,GroupA与B各占50%使用率)
3.el7.2代码图解(入口为红色五角星)
4.参考资料:
http://www.linuxjournal.com/magazine/real-time-linux-kernel-scheduler?page=0,0
start_kernel():https://danielmaker.github.io/blog/linux/start_kernel.html
http://blog.csdn.net/hlchou/article/details/7425416
http://blog.csdn.net/gatieme/article/details/52067748系列
[个人博客Linux kernel部分调度]
- 鸿蒙内核源码分析(调度队列篇) | 内核有多少个调度队列 | 百篇博客分析OpenHarmony源码 | v6.05
百篇博客系列篇.本篇为: v06.xx 鸿蒙内核源码分析(调度队列篇) | 内核有多少个调度队列 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度 ...
- quartz源码分析——执行引擎和线程模型
title: quartz源码分析--执行引擎和线程模型 date: 2017-09-09 23:14:48 categories: quartz tags: [quartz, 源码分析] --- - ...
- 鸿蒙内核源码分析(任务调度篇) | 任务是内核调度的单元 | 百篇博客分析OpenHarmony源码 | v4.05
百篇博客系列篇.本篇为: v04.xx 鸿蒙内核源码分析(任务调度篇) | 任务是内核调度的单元 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度 ...
- 鸿蒙内核源码分析(调度机制篇) | 任务是如何被调度执行的 | 百篇博客分析OpenHarmony源码 | v7.07
百篇博客系列篇.本篇为: v07.xx 鸿蒙内核源码分析(调度机制篇) | 任务是如何被调度执行的 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调 ...
- 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁的贡献最大 | 百篇博客分析OpenHarmony源码 | v3.05
百篇博客系列篇.本篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁的贡献最大 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度 ...
- 鸿蒙内核源码分析(线程概念篇) | 是谁在不停的折腾CPU? | 百篇博客分析OpenHarmony源码 | v21.06
百篇博客系列篇.本篇为: v21.xx 鸿蒙内核源码分析(线程概念篇) | 是谁在不断的折腾CPU | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调 ...
- 鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的 | 百篇博客分析OpenHarmony源码 | v5.05
百篇博客系列篇.本篇为: v05.xx 鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...
- 鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务 | 百篇博客分析OpenHarmony源码 | v41.03
百篇博客系列篇.本篇为: v41.xx 鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...
- 鸿蒙内核源码分析(系统调用篇) | 开发者永远的口头禅 | 百篇博客分析OpenHarmony源码 | v37.03
百篇博客系列篇.本篇为: v37.xx 鸿蒙内核源码分析(系统调用篇) | 开发者永远的口头禅 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...
随机推荐
- 巧克力分配问题——C语言
某品牌巧克力使用500克原料可制作55小块巧克力,请编程实现:输入原料重量(以千克为单位),计算出制作巧克力的块数(四舍五入).然后对这些巧克力进行分包,小盒放11块,大盒放24块,问各分装多少大盒多 ...
- org.apache.hadoop.security.AccessControlException
在hdfs集群上,需要向Hdfs写入文件,控制台会输出以下错误信息: Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoo ...
- IJ配置项目的TOMCAT
参考文档: IJ里配置TOMCAT http://jingyan.baidu.com/album/0a52e3f43d9f69bf62ed72f9.html?picindex=11 源发行版1.8 需 ...
- 【机器学习】Octave 实现逻辑回归 Logistic Regression
ex2data1.txt ex2data2.txt 本次算法的背景是,假如你是一个大学的管理者,你需要根据学生之前的成绩(两门科目)来预测该学生是否能进入该大学. 根据题意,我们不难分辨出这是一种二分 ...
- maven解决omitted for duplicate(依赖冲突)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...
- 【微信小程序开发】页面配置
app下的app.json文件是全局配置. app下的每一个page中,也可以配置.json文件. page中配置的内容是对应app中window配置项下的内容. page中的配置将覆盖window中 ...
- mui.fire()触发自定义事件
导读:添加自定义事件监听操作和标准js事件监听类似,可直接通过window对象添加,通过mui.fire()方法可触发目标窗口的自定义事件. 监听自定义事件 添加自定义事件监听操作和标准js事件监听类 ...
- js 时间戳转日期
timestampToTime(10位时间戳) function timestampToTime(timestamp) { var date = new Date(timestamp * 1000); ...
- python 更换 版本
这是一个悲伤的安装ipython的过程. 写下来留个教训吧. 也是希望对博友一些帮助吧. 注: 我也写了一篇window下安装bpython的文章(个人感觉bpython要比ipython强大的多), ...
- 秒杀系统-service
在Dao层我们只完成了针对表的相关操作,包括写了接口方法和映射文件中的sql语句,并没有编写逻辑的代码,例如对多个Dao层方法的拼接,当我们用户成功秒杀商品时我们需要进行商品的减库存操作(调用Seck ...