Linux内核进程管理子系统有什么第八十三回 —— 进程调度(10)

接前一篇文章:Linux内核进程管理子系统有什么第八十二回 —— 进程调度(9)

本文内容参考:

Linux内核进程管理专题报告_linux rseq-优快云博客

《趣谈Linux操作系统 核心原理篇:第三部分 进程管理》—— 刘超

《图解Linux内核 基于6.x》 —— 姜亚华 机械工业出版社

Linux内核分析(调度类和调度实体)-优快云博客

特此致谢!

上一回继续依次详解每一个调度类,讲解了rt调度类,本回讲解仅剩的一个也是最重要的一个调度类 —— fair_sched_class。

完全公平调度类

前文书已经给出了完全公平调度类fair_sched_class的定义,在kernel/sched/fair.c中,代码如下:

/*
 * All the scheduling class methods:
 */
DEFINE_SCHED_CLASS(fair) = {
 
	.enqueue_task		= enqueue_task_fair,
	.dequeue_task		= dequeue_task_fair,
	.yield_task		= yield_task_fair,
	.yield_to_task		= yield_to_task_fair,
 
	.check_preempt_curr	= check_preempt_wakeup,
 
	.pick_next_task		= __pick_next_task_fair,
	.put_prev_task		= put_prev_task_fair,
	.set_next_task          = set_next_task_fair,
 
#ifdef CONFIG_SMP
	.balance		= balance_fair,
	.pick_task		= pick_task_fair,
	.select_task_rq		= select_task_rq_fair,
	.migrate_task_rq	= migrate_task_rq_fair,
 
	.rq_online		= rq_online_fair,
	.rq_offline		= rq_offline_fair,
 
	.task_dead		= task_dead_fair,
	.set_cpus_allowed	= set_cpus_allowed_common,
#endif
 
	.task_tick		= task_tick_fair,
	.task_fork		= task_fork_fair,
 
	.prio_changed		= prio_changed_fair,
	.switched_from		= switched_from_fair,
	.switched_to		= switched_to_fair,
 
	.get_rr_interval	= get_rr_interval_fair,
 
	.update_curr		= update_curr_fair,
 
#ifdef CONFIG_FAIR_GROUP_SCHED
	.task_change_group	= task_change_group_fair,
#endif
 
#ifdef CONFIG_UCLAMP_TASK
	.uclamp_enabled		= 1,
#endif
};

完全公平调度类(fair_sched_class)也称CFS调度类,是最为常见、用得最多的调度类。它用于管理普通进程的调度,其调度方式又被称为完全公平调度(Completely Fair Scheduler,CFS),而这也是其名字的由来。

当然,所谓的完全公平是理论上的,所有的进程(任务)同时执行,每个进程占用等份的一小部分CPU时间。实际的硬件环境中,这种假设是不可能满足的,而且进程间由于优先级不同,本身就不应该平均分配,因此CFS引入了虚拟运行时间(virtual runtime)的概念。

虚拟运行时间是CFS挑选进程的标准,由实际时间结合进程优先级转换而来,由struct task_struct中的se.vruntime字段表示,vruntime小的进程优先执行。

这里要将一下完全公平调度算法及其原理

首先,需要记录下进程(任务)的运行时间。CPU会提供一个时钟,过一段时间就触发一个时钟中断。就像日常的钟表或手表一样,每1秒滴答一下,在系统中这一次滴答叫一个Tick。CFS会为每一个进程安排一个虚拟运行时间vrumtime(上边提到的)。

如果一个任务在运行,随着时间的增长,也就是一个个tick的到来,进程的vrumtime将不断增大。没有得到执行的人物的vruntime不变。

显然,那些vruntime少的任务,受到了不公平的对待。那么就优先运行这样的任务,弥补其所受的不公正待遇。

这类比于把一筐鸡蛋平均放到N个篮子里边,先大概分一下,之后看着哪个篮子中的鸡蛋少,就多放点;哪个篮子中的鸡蛋多,就少放点或者干脆不放。如此经过多轮,虽然不能保证每个篮子中的鸡蛋数量绝对一致,但至少也差不多。

在此基础上,再结合优先级(以及权重)的概念。类比于还是N个蓝子,但这些篮子可不都一样大了,而是有大有小。这回鸡蛋就不能按照个数分配了,而是要按照比例来。大个的篮子中多放,小个的篮子中少放。这样一来,虽然大篮子里的鸡蛋比小篮子里的鸡蛋数量多很多,但也认为是公平的。应用到进程上来,优先级高的进程权重大,多分配运行时间;优先级低的进程权重小,少分配运行时间。

总结:

  • 功能

fair_sched_class是"Completely Fair Scheduler"(完全公平调度)的调度类。它用于处理普通任务的调度,试图在所有任务之间公平地分配CPU时间。

  • 特点

完全公平调度(CFS)旨在提供一种公平的调度方式,以避免任务饥饿,并尽量均匀地分配CPU时间。CFS使用红黑树来跟踪任务的执行情况,并基于虚拟运行时间来决定调度顺序。

至此,各个调度类就从整体上讲解完了。

更多内容请看下回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝天居士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值