当前位置:首页 > 公众号精选 > 程序喵大人
[导读]什么是调度?按照某种调度算法,从进程的ready队列中选择进程给CPU。

什么是调度?按照某种调度算法,从进程的ready队列中选择进程给CPU。
为什么要调度?为了最大限度的利用CPU。

调度相关结构体

task_struct

我们先把task_struct中和调度相关的结构拎出来:
struct task_struct {
......
/*
*调度类。用 sched_class 对调度器进行抽象
*Stop调度器:stop_sched_class
*Deadline调度器:dl_sched_class
*RT调度器:rt_sched_class
*CFS调度器:cfs_sched_class
*IDLE-Task调度器:idle_sched_class
*/
const struct sched_class *sched_class;
//CFS调度实体
struct sched_entity  se;
//RT调度实体
struct sched_rt_entity  rt;
......
#ifdef CONFIG_CGROUP_SCHED
//任务组(在每个CPU上都会维护一个CFS调度实体、CFS运行队列; RT调度实体,RT运行队列)
struct task_group  *sched_task_group;
#endif
//DL调度实体
struct sched_dl_entity  dl;
......
/*
*进程的调度策略,有6种。
*限期进程调度策略:SCHED_DEADLINE。DL调度器
*实时进程调度策略:SCHED_FIFO,SCHED_RR。RT调度器
*普通进程调度策略:SCHED_NORMAL,SCHED_BATCH,SCHED_IDLE。CFS调度器
*/
unsigned int   policy;
......
}
  • struct sched_class 对调度器进行抽象,一共分为5类
  1. Stop调度器:优先级最高的调度类,可以抢占其他所有进程,不能被其他进程抢占;
  2. Deadline调度器:使用红黑树,把进程按照绝对截止期限进行排序,选择最小进程进行调度运行;
  3. RT调度器:为每个优先级维护一个队列;
  4. CFS调度器:采用完全公平调度算法,引入虚拟运行时间概念;
  5. IDLE-Task调度器:每个CPU都会有一个idle线程,当没有其他进程可以调度时,调度运行idle线程;
  • unsigned int policy 进程的调度策略有6种,用户可以调用调度器里的不同调度策略:
  1. SCHED_DEADLINE:使task选择Deadline调度器来调度运行
  2. SCHED_RR:时间片轮转,进程用完时间片后加入优先级对应运行队列的尾部,把CPU让给同优先级的其他进程;
  3. SCHED_FIFO:先进先出调度没有时间片,没有更高优先级的情况下,只能等待主动让出CPU;
  4. SCHED_NORMAL:使task选择CFS调度器来调度运行;
  5. SCHED_BATCH:批量处理,使task选择CFS调度器来调度运行;
  6. SCHED_IDLE:使task以最低优先级选择CFS调度器来调度运行;
  • struct sched_entity se;采用CFS算法调度的普通非实时进程的调度实体
  • struct sched_rt_entity rt;采用Roound-Robin或者FIFO算法调度的实时调度实体
  • struct sched_dl_entity dl;  采用EDF算法调度的实时调度实体

分配给CPU的task,作为调度实体加入到运行队列中
runqueue 运行队列
struct rq {
......

//三个调度队列:CFS调度,RT调度,DL调度
struct cfs_rq cfs;
struct rt_rq rt;
struct dl_rq dl;

......
//idle指向空闲内核线程, stop指向迁移内核线程
struct task_struct *curr, *idle, *stop;
......
}
三个调度队列:

  • struct cfs_rq cfs;  CFS调度队列
  • struct rt_rq rt;  RT调度队列
  • struct dl_rq dl;  DL调度队列
每个CPU都有一个运行队列,每个运行队列中有三个调度队列,task作为调度实体加入到各自的调度队列中。

调度流程

调度的本质就是选择下一个进程来运行,调度的过程分为两步:
  • 1. 设置调度标记

为CPU上正在运行的进程thread_info结构体里的flags成员设置TIF_NEED_RESCHED。
那么,什么时候设置TIF_NEED_RESCHED呢 ?
  1. scheduler_tick 时钟中断
  2. wake_up_process 唤醒进程的时候
  3. do_fork 创建新进程的时候
  4. smp_send_reschedule 负载均衡的时候
  5. set_user_nice 修改进程nice值的时候
以上情况下都会通过 resched_curr 来设置进程thread_info结构体里的flags成员为TIF_NEED_RESCHED。以 scheduler_tick 和 wake_up_process 为例:
关于是否需要设置TIF_NEED_RESCHED的依据涉及到具体的调度算法,等我们讲到具体调度器时再详细讲。
  • 2. 执行调度

kernel判断当前进程标记是否为TIF_NEED_RESCHED,是的话调用 schedule 函数切换上下文,kernel空间是可以关抢占的,user空间是无法关抢占的。抢占可分为内核态抢占和用户态抢占
  1. 用户态抢占
ret_to_user是系统调用,异常触发,中断处理完成后都会调用的函数。
  1. 内核态抢占

进程切换上下文 context_switch

通过上面我们知道执行调度的时候发生在 _schedule 函数里。
重点是其中的两个函数,一个是选择需要切换任务的 pick_next_task,另外一个是完成进程上下文切换 context_switch。
关于选择task的策略涉及到不同的调度类,等我们讲到具体调度器的时候再展开,这里重点讲下上下文切换的函数 context_switch,进程上下文切换主要涉及到两部分主要过程:进程地址空间切换和处理器状态切换:
  • 进程的地址空间切换
将下一个进程的pgd虚拟地址转化为物理地址存放在ttbr0_el1中(这是用户空间的页表基址寄存器),当访问用户空间地址的时候mmu会通过这个寄存器来做遍历页表获得物理地址。完成了这一步,也就完成了进程的地址空间切换,确切的说是进程的虚拟地址空间切换。
  • 寄存器状态切换
其中x19-x28是arm64 架构规定需要调用保存的寄存器,可以看到处理器状态切换的时候将前一个进程(prev)的x19-x28,fp,sp,pc保存到了进程描述符的cpu_contex中,然后将即将执行的进程(next)描述符的cpu_contex的x19-x28,fp,sp,pc恢复到相应寄存器中,而且将next进程的进程描述符task_struct地址存放在sp_el0中,用于通过current找到当前进程,这样就完成了处理器的状态切换。
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

2024年4月18日 – 提供超丰富半导体和电子元器件™的业界知名新品引入 (NPI) 代理商贸泽电子 (Mouser Electronics) 很荣幸地宣布与Edge Impulse建立新的全球合作关系。Edge Im...

关键字: 机器学习 MCU CPU

无论您是在研究如何使用 10GigE 还是寻求所需考虑事项的建议,本文均提供有实践,帮助确保单相机 10GigE 视觉系统设置顺利并拥有良好性能。 我们列出了主机系统配置、布线和相机设置的实践。

关键字: 视觉系统 CPU 存储器

Apr. 16, 2024 ---- NVIDIA新一代平台Blackwell,包含B系列GPU及整合NVIDIA自家Grace Arm CPU的GB200等。TrendForce集邦咨询指出,GB200的前一代为GH2...

关键字: CPU GPU

人工智能是集合众多方向的综合性学科,在诸多应用领域均取得了显著成果[1]。随着航空领域人工智能技术研究的不断深入,面向开放式机载智能交互场景,人工智能的应用可解决诸多问题。例如智能感知、辅助决策等,可利用人工智能算法对多...

关键字: 人工智能 PCIe CPU

CPU针脚弯了,用工具调正就不会有影响。开机自检也通过,CPU 再出问题就不是针脚引起的问题。针脚只要不断就没有问题,有的CPU出厂的时候针脚就有点弯,这并不是什么大问题,只要用镊子轻轻地弄直就可以了。

关键字: CPU 针脚 开机自检

瑞典乌普萨拉,2024年3月27日 – 全球领先的嵌入式系统开发软件解决方案供应商IAR自豪地宣布:公司备受全球数百万开发者青睐的开发环境再次升级,已率先支持瑞萨首款通用32位RISC-V MCU,该 MCU 搭载了瑞萨...

关键字: MCU RISC-V CPU

联发科与高通骁龙的对决可以说是一场性能与价值的较量,那么,你对两者的芯片有了解吗?在移动设备领域,芯片制造商的竞争愈发激烈。其中,来自台湾的联发科(MediaTek)与美国的高通(Qualcomm)无疑是该领域的两大巨头...

关键字: 联发科 高通骁龙 CPU 处理器

云和超大规模服务运营商正不断增大计算密度。随着 Microsoft Cobalt、阿里巴巴的倚天 710、AmpereOne等配置 128 核或以上的 CPU 设计进入市场,单个封装可实现的性能更强,且下一代的目标还将远...

关键字: CPU 处理器

Arm Neoverse 旨在为从云到边缘的全场景基础设施用例提供高性能和出色能效。针对需要更高性能的工作负载和用例,Arm 推出了 Neoverse V 系列。其中,Neoverse V2 核心已被行业先行者广泛部署于...

关键字: 云计算 人工智能 CPU

本文中,小编将对 CPU 开核予以介绍,如果你想对它的详细情况有所认识,或者想要增进对 CPU 开核的了解程度,不妨请看以下内容哦。

关键字: CPU 开核
关闭
关闭