4.5 周期性调度器scheduler_tick
周期调度器
周期性调度器scheduler_tick由内核时钟中断周期性的触发, 周期性调度器以固定的频率激活负责当前进程调度类的周期性调度方法, 以保证系统的并发性, 周期性调度器通过调用进程所属调度器类的task_tick操作完成周期性调度的通知和配置工作, 通过resched_curr函数(早期的resched_task函数)设置抢占标识TIF_NEED_RESCHED来通知内核在必要的时间由主调度函数完成真正的调度工作, 此种做法称之为延迟调度策略
4.6 主调度器schedule
主调度器
schedule就是主调度器的工作函数, 在内核中的许多地方, 如果要将CPU分配给与当前活动进程不同的另一个进程, 都会直接调用主调度器函数schedule或者其子函数__schedule.
__schedule完成抢占
- 完成一些必要的检查, 并设置进程状态, 处理进程所在的就绪队列
- 调度全局的pick_next_task选择抢占的进程 , 如果当前cpu上所有的进程都是cfs调度的普通非实时进程, 则直接用cfs调度, 如果无程序可调度则调度idle进程 , 否则从优先级最高的调度器类sched_class_highest(目前是stop_sched_class)开始依次遍历所有调度器类的pick_next_task函数, 选择最优的那个进程执行
- context_switch完成进程上下文切换 , 调用switch_mm(), 把虚拟内存从一个进程映射切换到新进程中 , 调用switch_to(),从上一个进程的处理器状态切换到新进程的处理器状态 。这包括保存、恢复栈信息和寄存器信息
context_switch流程
context_switch其实是一个分配器, 他会调用所需的特定体系结构的方法
- 调用switch_mm(), 把虚拟内存从一个进程映射切换到新进程中 , switch_mm更换通过task_struct->mm描述的内存管理上下文, 该工作的细节取决于处理器, 主要包括加载页表, 刷出地址转换后备缓冲器(部分或者全部), 向内存管理单元(MMU)提供新的信息
- 调用switch_to(),从上一个进程的处理器状态切换到新进程的处理器状态 。这包括保存、恢复栈信息和寄存器信息 , switch_to切换处理器寄存器的呢内容和内核栈(虚拟地址空间的用户部分已经通过switch_mm变更, 其中也包括了用户状态下的栈, 因此switch_to不需要变更用户栈, 只需变更内核栈), 此段代码严重依赖于体系结构, 且代码通常都是用汇编语言编写.
在新进程被选中执行时, 内核恢复到进程被切换出去的点继续执行, 此时内核只知道谁之前将新进程抢占了, 但是却不知道新进程再次执行是抢占了谁, 因此底层的进程切换机制必须将此前执行的进程(即新进程抢占的那个进程)提供给context_switch. 由于控制流会回到函数的该中间, 因此无法通过普通函数的返回值来完成. 因此使用了一个3个参数, 但是逻辑效果是相同的, 仿佛是switch_to是带有两个参数的函数, 而且返回了一个指向此前运行的进程的指针.
switch_to(prev, next, last);其中返回的prev值并不是做参数的prev值, 而是prev被再次调度的时候抢占掉的那个进程last.
即
prev = last = switch_to(prev, next);
4.8 处理进程优先级
内核使用一些简单的数值范围0~139表示内部优先级, 数值越低, 优先级越高 。
从0~99的范围专供实时进程使用, nice的值[-20,19]则映射到范围100~139
文章插图
其中task_struct采用了三个成员表示进程的优先级:prio和normal_prio表示动态优先级, static_prio表示进程的静态优先级.
此外还用了一个字段rt_priority保存了实时进程的优先级
文章插图
静态优先级static_prio(普通进程)和实时优先级rt_priority(实时进程)是计算的起点
因此他们也是进程创建的时候设定好的, 我们通过nice修改的就是普通进程的静态优先级static_prio
首先通过静态优先级static_prio计算出普通优先级normal_prio, 该工作可以由nromal_prio来完成, 该函数定义在kernel/sched/core.c#L861
内核通过effective_prio设置动态优先级prio, 计算动态优先级的流程如下
- 设置进程的普通优先级(实时进程99-rt_priority, 普通进程为static_priority)
- 计算进程的动态优先级(实时进程则维持动态优先级的prio不变, 普通进程的动态优先级即为其普通优先级)
推荐阅读
- 关于黄茶的采摘的介绍,黄茶的种类全介绍
- 君山银针可以冲泡几遍,如何冲泡好杯君山银针茶
- 君山银针品种大全,君山银针的特征
- js中同步和异步编程
- 温州黄汤冲泡步骤,温州平阳黄汤黄茶类中的黄小茶
- 君山银针哪个季节喝好,如何鉴别君山银针
- 黄芽茶适合女人喝吗,黄茶适合什么人喝
- 君山银针的贮藏方法,鉴别优质君山银针的方法
- 远安黄茶功效作用,黄茶知识
- 雅安黄茶简介,黄茶有哪些